首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWT: TableViewerColumn中的超链接,具有MouseListener和正确的列宽

SWT: TableViewerColumn中的超链接,具有MouseListener和正确的列宽
EN

Stack Overflow用户
提问于 2022-11-10 09:54:01
回答 1查看 21关注 0票数 0

我想在TableViewerColumn单元格中添加超链接(或样式类似超链接的文本)。我试过thisthis

概述:我要么得到一个可点击的超链接,其中的文本被裁剪(列的宽度太小),要么我得到一个不可点击的链接(缺少MouseListener,没有光标)。

这两种尝试都在使用StyledCellLabelProvider作为TableViewerColumn。第一次尝试是这样的:

代码语言:javascript
复制
TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
column .getColumn().setText(TITLE);
column .setLabelProvider(new MyHyperlinkLabelProvider());

但是,单元格中的文本是裁剪的,我不知道如何设置列的宽度,以使文本适合单元格。我试过使用pack(),但没有效果。

代码语言:javascript
复制
private final class MyHyperlinkLabelProvider extends StyledCellLabelProvider {

    private MyHyperlinkLabelProvider() {
    }

    @Override
    public void update(ViewerCell cell) {
        TableItem item = (TableItem)cell.getItem();
        String myText= "Hyperlink text, unfortunately cropped";

        link = new MyHyperlink((Composite)cell.getViewerRow().getControl(), SWT.NONE);
        toolkit.adapt(link);
        link.setText(myText);
        TableEditor editor = new TableEditor(item.getParent());
        editor.grabHorizontal = true;
        editor.grabVertical = true;
        editor.setEditor(link, item, cell.getColumnIndex());
        GridDataFactory.fillDefaults().applyTo(editor.getEditor());
        editor.layout();
        link.addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseUp(MouseEvent event) {
                super.mouseUp(event);
                if (event.getSource() instanceof MyHyperlink) {
                    MyHyperlink link = (MyHyperlink)event.getSource();
                    System.out.println("Label was clicked: " + link.getText());
                }
            }
        });

        super.update(cell);
    }
}

private class MyHyperlink extends Hyperlink {
    public MyHyperlink(Composite parent, int style) {
        super(parent, style);
        this.setUnderlined(true);
    }
}

在第二链路中给出了较不受欢迎的备选方案。如果我不能得到正确的列宽,我会用这个。第二个链接建议用StyledString而不是Hyperlink来尝试。StyledString至少显示为全宽度,并且列具有正确的宽度。但是,不能将MouseListener添加到StyledString中。只在桌子上,但没什么用。

代码语言:javascript
复制
private final class MyHyperlinkLabelProvider extends StyledCellLabelProvider {

    private MyHyperlinkLabelProvider() {
    }

    @Override
    public void update(ViewerCell cell) {
        TableItem item = (TableItem)cell.getItem();

        String mytext= "This is the hyperlink text";

        /* make text look like a link */
        StyledString text = new StyledString();
        StyleRange myStyledRange =
            new StyleRange(0, phase.length(), Display.getCurrent().getSystemColor(SWT.COLOR_BLUE), null);
        myStyledRange.underline = true;
        text.append(mytext, StyledString.DECORATIONS_STYLER);
        cell.setText(text.toString());

        StyleRange[] range = {myStyledRange };
        cell.setStyleRanges(range);

        super.update(cell);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-16 07:39:55

若要正确计算列大小,必须设置单元格文本。虽然超链接应该显示,但link.setText(myText);是不够的。cell.setText(myText)也是必需的。

您可以在第二个片段中看到它,对于第二个片段,列大小是正确的。这是因为cell.setText()调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74387104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档