2012-09-20 115 views
3

我想從我的表中的數據創建一個arraylist。我需要從可見列中獲取值,但我也需要從列中不可見的列中獲取值。使用SWT與表查看器,我不知道如何不顯示我的表中的列。我也不知道如何通過指定列名來從表中提取數據。SWT - 表查看器 - 隱藏列和從列中獲取值

我一直使用Swing,所以我一直使用Table Model Class。在swing中,創建列非常簡單,隱藏它們並從中獲取數據。

這就是我在之前的Swing項目中所做的。

在我的桌子模型類

public String getColumnName(int column) { 
    String s = null; 

    switch (column) { 
    case ITEMID_COL: { 
     s = "ItemId"; 
     break; 
    } 

然後getValueAt()

public Object getValueAt(int row, int column) { 
    Object o = null; 

    try { 
    switch (column) { 
     case ITEMID_COL: { 
      o = rds.get(row).rev.getItem().getStringProperty("item_id"); 
      break; 
     } 

所以,當我需要從我的表中的數據在任何其他類,都是我所要做的就是

Object item_id = SingletonSelectTable.getInstance().getValueAt(i, SingletonSelectTable.getInstance().ITEMID_COL); 

我也可以很容易地喜通過設置MAX_COLUMNS來設置。

問題

  1. 我需要學習如何將列添加到那些不會被顯示,但仍然含有使用表查看值的表。

  2. 我需要學習如何從表中訪問值,所以我可以從列創建一個可見和不可見數據的數組。

  3. 這甚至可以使用表格查看器嗎?

回答

9

好吧:

要隱藏TableColumn,你基本上可以其寬度設置爲0,防止調整大小。通過將寬度設置爲>= 0並啓用調整大小來取消隱藏。

由於您將TableViewer與ModelProvider一起使用,因此當您要訪問內容時隱藏列並不重要。只需從模型中獲取對象並從中獲取信息即可。

這裏是一個可以隱藏/取消隱藏列,仍然打印當前選擇的人的例子:

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new GridLayout(2, false)); 

    final TableViewer viewer = new TableViewer(shell, SWT.READ_ONLY); 

    // First column is for the name 
    TableViewerColumn col = createTableViewerColumn("Name", 100, 0, viewer); 
    col.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public String getText(Object element) { 
      if(element instanceof Person) 
      { 
       System.out.println("1"); 
       return ((Person)element).getName(); 
      } 
      return ""; 
     } 
    }); 

    // First column is for the location 
    TableViewerColumn col2 = createTableViewerColumn("Location", 100, 1, viewer); 
    col2.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public String getText(Object element) { 
      if(element instanceof Person) 
      { 
       System.out.println("2"); 
       return ((Person)element).getLocation(); 
      } 
      return ""; 
     } 
    }); 

    final Table table = viewer.getTable(); 
    table.setHeaderVisible(true); 
    table.setLinesVisible(true); 
    GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); 
    data.horizontalSpan = 2; 
    table.setLayoutData(data); 

    /* This button will hide/unhide the columns */ 
    Button button1 = new Button(shell, SWT.PUSH); 
    button1.setText("Hide/Unhide"); 

    button1.addListener(SWT.Selection, new Listener() { 

     @Override 
     public void handleEvent(Event arg0) { 
      for(final TableColumn column : table.getColumns()) 
      { 
       if(column.getWidth() == 0) 
       { 
        column.setWidth(100); 
        column.setResizable(true); 
       } 
       else 
       { 
        column.setWidth(0); 
        column.setResizable(false); 
       } 
      } 
     } 
    }); 

    /* This button will print the currently selected Person, even if columns are hidden */ 
    Button button2 = new Button(shell, SWT.PUSH); 
    button2.setText("Print"); 

    button2.addListener(SWT.Selection, new Listener() { 

     @Override 
     public void handleEvent(Event arg0) { 
      IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); 
      Person person = (Person) selection.getFirstElement(); 

      System.out.println(person); 
     } 
    }); 

    viewer.setContentProvider(ArrayContentProvider.getInstance()); 

    final Person[] persons = new Person[] { new Person("Baz", "Loc"), 
      new Person("BazBaz", "LocLoc"), new Person("BazBazBaz", "LocLocLoc") }; 

    viewer.setInput(persons); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 
} 

private static TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber, TableViewer viewer) { 
    final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); 
    final TableColumn column = viewerColumn.getColumn(); 
    column.setText(title); 
    column.setWidth(bound); 
    column.setResizable(true); 
    column.setMoveable(false); 

    return viewerColumn; 
} 

public static class Person { 
    private String name; 
    private String location; 

    public Person(String name, String location) { 
     this.name = name; 
     this.location = location; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 

    public String toString() 
    { 
     return name + " " + location; 
    } 
} 
1

唯一要注意的就是設置列寬0不會調用標籤getText()方法防止該專欄的提供者。如果必須避免此呼叫(例如耗時),則解決方案是dispose()樹列。 (要再次顯示列,必須重新創建。)