其他带有Java SWT的列中的工具提示



我有一个有 4 列的表格。我尝试为第三列的所有单元格集成工具提示。使用我的代码,工具提示仅针对第一列的单元格显示。

这是我的代码:

protected void checkAction() throws Exception {
    System.out.println("Start Test");
    //Erstellen einer neuen Shell
    final Shell shell = new Shell();
    shell.setSize(280, 300);
    shell.setText("Testtabelle");
    //Erstellen einer neuen Tabelle
    final Table table = new Table(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
    table.setLinesVisible(true);
    table.setHeaderVisible(true);
    //Einlesen der Überschriften und Vergabe der Namen
    String[] titles = {"Element", "Stage", "Type", "Generate-User", "Change-User" }; 
    for (int i = 0; i < titles.length; i++) {
      TableColumn column = new TableColumn(table, SWT.NONE);
      column.setText(titles[i]);
    }
    // Inhalte hinzufügen
    final int count = 4;
    for (int i = 0; i < count; i++) {
      TableItem item = new TableItem(table, SWT.NONE);
      item.setText(0, "Test "+i);
      item.setText(1, ""+(i+1));
      item.setText(2, "Testtype");
      item.setText(3, "562910");
      item.setText(4, "423424");
    }

            // Disable native tooltip
    table.setToolTipText ("");
    // Implement a "fake" tooltip
    final Listener labelListener = new Listener () {
        public void handleEvent (Event event) {
            Label label = (Label)event.widget;
            Shell shell = label.getShell ();
            switch (event.type) {
                case SWT.MouseDown:
                    Event e = new Event ();
                    e.item = (TableItem) label.getData ("_TABLEITEM");
                    // Assuming table is single select, set the selection as if
                    // the mouse down event went through to the table
                    table.setSelection (new TableItem [] {(TableItem) e.item});
                    table.notifyListeners (SWT.Selection, e);
                    shell.dispose ();
                    table.setFocus();
                    break;
                case SWT.MouseExit:
                    shell.dispose ();
                    break;
            }
        }
    };
    Listener tableListener = new Listener () {
        Shell tip = null;
        Label label = null;
        public void handleEvent (Event event) {
            switch (event.type) {
                case SWT.Dispose:
                case SWT.KeyDown:
                case SWT.MouseMove: {
                    if (tip == null) break;
                    tip.dispose ();
                    tip = null;
                    label = null;
                    break;
                }
                case SWT.MouseHover: {
                    TableItem item = table.getItem (new Point (event.x, event.y));

                        if (item != null) {
                        if (tip != null  && !tip.isDisposed ()) tip.dispose ();
                        tip = new Shell (shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
                        FillLayout layout = new FillLayout ();
                        layout.marginWidth = 2;
                        tip.setLayout (layout);
                        label = new Label (tip, SWT.NONE);
                        label.setData ("_TABLEITEM", item);
                        if (item.getText().equals("Test 3")){
                            label.setText ("Jonas Intfeld");
                            }
                        else{
                            label.setText (item.getText ());
                        }
                        label.addListener (SWT.MouseExit, labelListener);
                        label.addListener (SWT.MouseDown, labelListener);
                        Point size = tip.computeSize (SWT.DEFAULT, SWT.DEFAULT);
                        Rectangle rect = item.getBounds (0);
                        Point pt = table.toDisplay (rect.x, rect.y);
                        tip.setBounds (pt.x, pt.y, size.x, size.y);
                        tip.setVisible (true);
                    }
                }
            }
        }
    };
    table.addListener (SWT.Dispose, tableListener);
    table.addListener (SWT.KeyDown, tableListener);
    table.addListener (SWT.MouseMove, tableListener);
    table.addListener (SWT.MouseHover, tableListener);
    // Tabelle und Shell Packen  
       for (int i = 0; i < titles.length; i++) {
          table.getColumn(i).pack();
        }
        table.setSize(table.computeSize(SWT.DEFAULT, 200));
        shell.pack();
    // Shell öffnen
    try {  shell.open();
    } catch (SWTException e) {
        System.out.println("Test: "+e);
        shell.close();
    }      
}   

有没有办法激活 3 的工具提示。列?在我移动到 3 中的单元格上的那一刻。列,将显示 1 的工具提示。列。

也许最好的选择是按标题搜索列?

你的问题是这一行:

Rectangle rect = item.getBounds(0);

您要求第一列的边界。只需将索引更改为要显示工具提示的列,就可以了:

Rectangle rect = item.getBounds(2);

如果需要从鼠标位置获取列索引,请使用以下代码:

Point point = new Point(event.x, event.y);
int column = 0;
for (int i = 0; i < table.getColumnCount(); i++)
{
    if (item.getBounds(i).contains(point))
    {
        column = i;
        break;
    }
}
Rectangle rect = item.getBounds(column);

最新更新