2017-06-12 167 views
1

我想在SWT表格列的每個單元格上有多個超鏈接。 我跟着線程SWT Table and Hyperlink widget integration和修改Sambi的答案我的要求。SWT表單元格多個超鏈接

我能夠在每個單元格中獲得一個超鏈接並使用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不同大小的行。它已知的bug。如果你設置的話,你也不能減小行的大小(它也被稱爲bug-platform specific)。

Approach2:

您可以管理顯示在您操作列一個小的自定義提示,這將對所有的鏈接,這些想法最初細胞將只顯示一個鏈接,當你在它移動鼠標將彈出一個自定義工具提示與您的所有鏈接。

由於我在辦公室,我現在無法分享示例代碼片段。但如果你需要,我會在晚上分享它。

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