SWTテーブルの列の各セルに複数のハイパーリンクが必要です。 スレッドSWT Table and Hyperlink widget integrationに従って、Sambiの答えを私の要求に変更しました。SWTテーブルセル複数のハイパーリンク
各セルでハイパーリンクを1つ取得し、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;
}
}
}
おかげで、 ええ、私あまりにもアプローチ1と考えると、理由の制限のために、それを実装することができませんでした。 アプローチ2のサンプルスニペットを共有してください。 –
はアプローチ2を試してみて、他の人のために回答セクションにコードを掲載しました。 意味のある解決策があるので答えを受け入れる –