SWT表格单元格有多个超链接

时间:2017-06-12 09:34:59

标签: hyperlink swt jface

我想在SWT表列的每个单元格上有多个超链接。 我按照帖子SWT Table and Hyperlink widget integration修改了Sambi对我的要求的回答。

我能够在每个单元格中获得一个超链接,并使用Hyperlinklistener调用浏览器。我现在想在每个单元格中有多个超链接。

以下是修改后的代码供您参考:

public class TableEditorTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        TableViewer viewer = new TableViewer(shell);
        viewer.getTable().setHeaderVisible(true);
        viewer.getTable().setLinesVisible(true);
        viewer.setContentProvider(new ArrayContentProvider());
        TableColumn column = new TableColumn(viewer.getTable(), SWT.NONE);
        column.setText("First Name");
        column.setWidth(100);
        TableViewerColumn firstNameCol = new TableViewerColumn(viewer, column);
        firstNameCol.setLabelProvider(new ColumnLabelProvider(){
            @Override
            public String getText(Object element) {
                Person p = (Person)element;
                return p.getFirstName();
            }
        });
        column = new TableColumn(viewer.getTable(), SWT.NONE);
        column.setText("Last Name");
        column.setWidth(100);
        TableViewerColumn lastNameCol = new TableViewerColumn(viewer, column);
        lastNameCol.setLabelProvider(new ColumnLabelProvider(){
            @Override
            public String getText(Object element) {
                Person p = (Person)element;

                return p.getLastName();
            }
        });
        column = new TableColumn(viewer.getTable(), SWT.NONE);
        column.setText("Actions");
        column.setWidth(100);
        TableViewerColumn actionsNameCol = new TableViewerColumn(viewer, column);
        actionsNameCol.setLabelProvider(new ColumnLabelProvider(){
            //make sure you dispose these buttons when viewer input changes
            Map<Object, Hyperlink> buttons = new HashMap<Object, Hyperlink>();
            @Override
            public void update(ViewerCell cell) {
                TableItem item = (TableItem) cell.getItem();
                final Hyperlink hyperlink;
                if(buttons.containsKey(cell.getElement()))
                {
                    hyperlink=buttons.get(cell.getElement());
                }
                else
                {
                    hyperlink=new Hyperlink ((Composite) (cell.getViewerRow().getControl()),SWT.NONE);
                    hyperlink.setText( "link1");
                    hyperlink.setHref("http://www.google.com/");
                    hyperlink.addHyperlinkListener(new HyperlinkAdapter(){
                        public void linkActivated(HyperlinkEvent e){
                            System.out.println(e.getHref());
                            org.eclipse.swt.program.Program.launch(hyperlink.getHref().toString());
                        }
                    });
                    buttons.put(cell.getElement(), hyperlink);
                }
                TableEditor editor = new TableEditor(item.getParent());
                editor.grabHorizontal  = true;
                editor.grabVertical = true;
                editor.setEditor(hyperlink , item, cell.getColumnIndex());

                editor.layout();
            }
        });
        Person p1 = new Person();
        p1.setFirstName("George");
        p1.setLastName("Burne");

        Person p2 = new Person();
        p2.setFirstName("Adam");
        p2.setLastName("Silva");

        Person p3 = new Person();
        p3.setFirstName("Nathan");
        p3.setLastName("Cowl");

        List<Person> persons = new ArrayList<Person>();
        persons.add(p1);
        persons.add(p2);
        persons.add(p3);

        viewer.setInput(persons);

        shell.open();
        while(!shell.isDisposed())
        {
            if(!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        display.dispose();
    }


    private static class Person
    {
        String firstName;
        String lastName;

        Person()
        {

        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

<强> Approach1:

您可以在其上设置包含多个链接的合成,并在编辑器中设置该合成并完成。

enter image description here

此方法的问题是您在SWT / JFACE中不能有不同大小的行。它已知的bug。如果你设置的话,你也不能减少行的大小(它也是特定于bug的平台)。

<强> Approach2:

您可以设法在动作列上显示一个小的自定义工具提示,它将包含您的所有链接。这些创意最初只会显示一个链接,当您在其上移动鼠标时,会弹出一个自定义工具提示链接。

当我在办公室时,我现在无法共享示例代码段。但如果你需要我会在晚上分享。

答案 1 :(得分:0)

我已经浪费了一周的时间。我已经转向了另一种更适合我的RCP应用程序的解决方案。

如果有人需要,下面是更新的代码。

根据Shrirang的回答方法2管理获取工具提示。但是,工具提示仅适用于第一列。 如果有人设法在除第一列之外的任何其他列上获取工具提示,请在此处发布该片段以便其他用户使用。

 ERROR TaskSetManager: Task 0 in stage 0.0 failed 4 times; aborting job
 Error :Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, hdpoc-c01-r06-01, executor 1): java.io.InvalidClassException: org.apache.commons.lang3.time.FastDateFormat; local class incompatible: stream classdesc serialVersionUID = 2, local class serialVersionUID = 1
                        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617)
                        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)