我想在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;
}
}
}
答案 0 :(得分:0)
<强> Approach1:
您可以在其上设置包含多个链接的合成,并在编辑器中设置该合成并完成。
此方法的问题是您在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)