我想在TableViewerColumn单元格中添加超链接(或样式类似超链接的文本)。我试过this和this。
概述:我要么得到一个可点击的超链接,其中的文本被裁剪(列的宽度太小),要么我得到一个不可点击的链接(缺少MouseListener,没有光标)。
这两种尝试都在使用StyledCellLabelProvider作为TableViewerColumn。第一次尝试是这样的:
TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
column .getColumn().setText(TITLE);
column .setLabelProvider(new MyHyperlinkLabelProvider());但是,单元格中的文本是裁剪的,我不知道如何设置列的宽度,以使文本适合单元格。我试过使用pack(),但没有效果。
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中。只在桌子上,但没什么用。
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);
}
}发布于 2022-11-16 07:39:55
若要正确计算列大小,必须设置单元格文本。虽然超链接应该显示,但link.setText(myText);是不够的。cell.setText(myText)也是必需的。
您可以在第二个片段中看到它,对于第二个片段,列大小是正确的。这是因为cell.setText()调用。
https://stackoverflow.com/questions/74387104
复制相似问题