【问题标题】:Tooltip in other colums with Java SWT?Java SWT 的其他列中的工具提示?
【发布时间】:2014-02-12 11:51:38
【问题描述】:

我有一张有 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. 列。

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

【问题讨论】:

    标签: java eclipse-plugin swt tooltip


    【解决方案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);
    

    【讨论】:

    • 从上一个问题我认为 OP 想从鼠标位置计算出列索引。
    • @greg-449 更新了我的答案。
    • 谢谢你 :) 现在工具提示出现在正确的列中,但内容错误(内容仍然来自第 0 列
    • @JonnyBeton 使用item.getText(column) 获取列文本
    • cool :) 它有效 :) 最后一个问题:我可以按名称获取一列吗?我只想为具有不同列结构的不同表中的“更改用户”列激活收费提示?
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多