Tooltip in other colums with Java SWT?

2019-04-17 02:47发布

I have a table with 4 columns. I try to integrate a ToolTip for all cells of the third column. With my Code the ToolTip only appears for the cells of the first column.

This is my Code:

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();
    }      

}   

Is there any way to activate the Tooltip for the 3. Column ? At the moment when I move over the cells in the 3. column the Tooltip appears for the 1. column.

Maybe the best option is to search the column by title?

1条回答
霸刀☆藐视天下
2楼-- · 2019-04-17 03:21

Your problem is this line:

Rectangle rect = item.getBounds(0);

You are asking for the bounds of the first column. Just change the index to the column where you want your tooltip to appear and you'll be fine:

Rectangle rect = item.getBounds(2);

If you need to get the column index from the mouse position, use this code:

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);
查看更多
登录 后发表回答