【问题标题】:SWT table cell multiple hyperlinksSWT 表格单元格多个超链接
【发布时间】:2017-06-12 09:34:59
【问题描述】:

我想在 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;
        }
    }
}

【问题讨论】:

    标签: hyperlink swt jface


    【解决方案1】:

    方法1:

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

    这种方法的问题是在 SWT/JFACE 中不能有不同大小的行。它的已知错误。同样,如果您设置,则不能减小行的大小(也称为特定于错误平台)。

    方法二:

    您可以设法在您的操作列上显示一个小的自定义工具提示,其中将包含您的所有链接,创意最初的单元格将仅显示一个链接,当您将鼠标移到它上面时会弹出一个自定义工具提示,其中包含您的所有链接。

    由于我在办公室,我现在不能分享示例代码 sn-p。但如果你需要,我会在晚上分享。

    【讨论】:

    • 感谢您的想法,是的,我也想过方法1,但由于限制,无法实施。请分享方法 2 的示例 sn-p。同时我也会尝试
    • 尝试了方法 2 并将代码发布在答案部分以供他人参考。接受您的答案,因为它有有意义的解决方案
    【解决方案2】:

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

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

    根据 Shrirang 的回答的 Approach2 设法获取工具提示。但是,工具提示仅适用于第一列。 如果有人设法在除第一列之外的任何其他列上获得工具提示,请在此处发布 sn-p 以供其他用户使用。

    public class TableEditorTest {
    
        public static void main(String[] args) {
            final Display display = new Display();
            final Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            final TableViewer viewer = new TableViewer(shell);
            viewer.getTable().setHeaderVisible(true);
            viewer.getTable().setLinesVisible(true);
            viewer.setContentProvider(new ArrayContentProvider());
            ColumnViewerToolTipSupport.enableFor(viewer);
            viewer.getTable().setToolTipText("");
            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(){
                @Override
                public String getText(Object element) {
                    Person p = (Person)element;
    
                    return p.getLastName();
                }
            });
    
            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);
    
            Listener tooltipListener = new Listener() {
                Shell tip = null;
                ArrayList<Hyperlink> arrHypLnk=new ArrayList<Hyperlink>();
                //Label label = null;
                @Override
                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;
                        for(Hyperlink h: arrHypLnk){
                            h.dispose();
                        }
                        arrHypLnk.clear();
                        break;
                    }
                    case SWT.MouseHover: {
                        TableItem item = viewer.getTable().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);
                            tip.setBackground (display.getSystemColor (SWT.COLOR_INFO_BACKGROUND));
    
                            GridLayout layout = new GridLayout();
                            layout.numColumns = 1;
                            layout.makeColumnsEqualWidth = true;
                            tip.setLayout (layout);
                            tip.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
                            TableItem itemm = (TableItem) event.item;
                            String text = item.getText(event.index);
                            String[] texts= new String[]{"Link1", "Link2", "Link3"};
                            for(String s: texts){
                                final Hyperlink h=new Hyperlink(tip, SWT.NONE);
                                h.setText(s);
                                h.setHref(s);
                                h.addHyperlinkListener(new HyperlinkAdapter(){
                                    public void linkActivated(HyperlinkEvent e){
    org.eclipse.swt.program.Program.launch(h.getHref().toString());
                                    }
                                });
                                arrHypLnk.add(h);
                            }
    
                            Point size = tip.computeSize (SWT.DEFAULT, SWT.DEFAULT);
                            Rectangle rect = item.getBounds (0);
                            Point pt = viewer.getTable().toDisplay (rect.x, rect.y);
                            tip.setBounds (pt.x, pt.y, size.x, size.y);
                            tip.setVisible (true);
                        }
                    }
                }
                }
            };
            viewer.getTable().addListener(SWT.MouseHover, tooltipListener);
            viewer.getTable().addListener(SWT.MouseMove, tooltipListener);
            viewer.getTable().addListener(SWT.KeyDown, tooltipListener);
    
            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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2020-10-16
      • 2012-03-01
      • 2021-06-04
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多