2017-06-12 14 views
1

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; 
     } 
    } 
} 

答えて

0

Approach1:

あなたはその上に複数のリンクとの複合体を設定し、エディタとその行わ中でその複合を設定することができます

以下はあなたの参照のために変更されたコードです。

enter image description here

このアプローチの問題点は、SWT/JFaceの中に異なるサイズの行を持つことができないです。その既知のバグ。繰り返しますが、設定した行のサイズを減らすことはできません(バグプラットフォーム固有のバグでもあります)。

Approach2:あなたはすべてのあなたのリンク、アイデアを持っていますあなたのアクション列、上の小さなカスタムツールチップを表示するように管理することができ

が最初のセルが1つのリンクのみが表示されますされていて、その上にマウスを移動すると、すべてのリンクを含むカスタムツールチップがポップアップ表示されます。

私は現在就任しているので、サンプルコードスニペットを今すぐ共有することはできません。しかし、必要ならば私は夕方にそれを分かち合うつもりです。

+0

おかげで、 ええ、私あまりにもアプローチ1と考えると、理由の制限のために、それを実装することができませんでした。 アプローチ2のサンプルスニペットを共有してください。 –

+0

はアプローチ2を試してみて、他の人のために回答セクションにコードを掲載しました。 意味のある解決策があるので答えを受け入れる –

0

私はすでにこれで1週間を無駄にしています。私は自分のRCPアプリケーションに適した別のソリューションに移行しました。

以下のコードは、必要に応じて更新されたコードです。

Shrirangの答えのアプローチ2に従ってツールチップを取得するように管理しました。ただし、ツールチップは最初の列にのみ表示されます。 誰かが最初のカラム以外のカラムでツールチップを取得できた場合は、他のユーザのためにここにスニペットを投稿してください。アイデアのための

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; 
     } 
    } 
} 
関連する問題