JTable - 使其中一个标题在单击时表现不同

时间:2013-11-04 15:07:33

标签: java swing jtable jtableheader rowsorter

我有一个简单的JTable:

    String[] columnNames = {"Freetext",
                            "Numbers only",
                            "Combobox"};

    Object[][] data = {
    {"Kathy", new Integer(21), "Female"},
    {"John", new Integer(19), "Male"},
    {"Sue", new Integer(20), "Female"},
    {"Joe", new Integer(22), "Male"}
    };

    final JTable table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setAutoCreateRowSorter(true);
    table.setFillsViewportHeight(true);
    TableColumn comboboxCol = table.getColumnModel().getColumn(2);
    JComboBox comboBox = new JComboBox();
    comboBox.addItem("Male");
    comboBox.addItem("Female");
    comboboxCol.setCellEditor(new DefaultCellEditor(comboBox));       
    table.getColumnModel().getColumn(1).setCellEditor(new IntegerEditor(0, 100)); 

当我点击colum标题时,它将在升序和降序排序之间交替。我想添加一个列标题,在点击时会有不同的行为,其他标题会保留其行为。你会怎么做?

3 个答案:

答案 0 :(得分:2)

table.setAutoCreateRowSorter(true);:此操作定义了一个行分类器,它是TableRowSorter的一个实例。这提供了一个表,当用户单击列标题时,该表执行简单的特定于语言环境的排序。您可以使用SortKeys指定列的排序顺序和优先级进行排序:

TableRowSorter sorter = (TableRowSorter) table.getRowSorter();
List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(table.getColumnModel().getColumnIndex("aColumnID"), SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(table.getColumnModel().getColumnIndex("bColumnID"), SortOrder.UNSORTED));
 // to specify no sorting should happen on 'bColumnID'
sorter.setSortKeys(sortKeys);

同样,如果您要在特定列上指定事件,例如标识为bColumnID 的列:

table.getTableHeader().addMouseListener(new MouseAdapter() {

   @Override
   public void mouseClicked(MouseEvent e) {
     super.mouseClicked(e); 
     JTableHeader header = (JTableHeader)(e.getSource());  
     JTable tableView = header.getTable();  
     TableColumnModel columnModel = tableView.getColumnModel();  
     int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 

      if(columnModel.getColumn(viewColumn).getIdentifier().equals("bColumnID"))
      {
          JOptionPane.showMessageDialog(null, "Hi bColumnID header is clicked");
      }

      }


});

修改:

但是,我理解你错了(that upon one of the column header click you want the table unsorted and do other action) but as @camickr has made that clear,请使用:sorter.setSortable(index, boolean)

更正式地说,关闭具有列标识符的特定列的排序,例如"bColumnName"

sorter.setSortable(table.getColumnModel().getColumnIndex("bColumnName"), false);

禁用对标识为"bColumnName"的列的排序。

答案 1 :(得分:1)

  

我希望它有完全不同的动作 - 不是分拣机的扩展动作

然后你有两个步骤:

  1. 禁用特定列的排序。这是通过使用setSortable(column, false)

  2. DefaultRowSorter方法完成的
  3. 单击表标题时启用其他操作。这是通过向表头添加MouseListener来完成的。

答案 2 :(得分:0)

您必须实现自己的RowSorter,并且在toggleSortOrder方法中,您需要允许包含4个选项的列切换到其他列不具有的新排序。< / p>

要更新显示,您可以扩展DefaultTableCellHeaderRenderer类,并添加除当前存在的其他排序顺序项。

班上的片段:

   SortOrder sortOrder = getColumnSortOrder(table, column);
             if (sortOrder != null) {
                 switch(sortOrder) {
                 case ASCENDING:
                     sortIcon = UIManager.getIcon(
                         "Table.ascendingSortIcon");
                     break;
                 case DESCENDING:
                     sortIcon = UIManager.getIcon(
                         "Table.descendingSortIcon");
                     break;
                 case UNSORTED:
                     sortIcon = UIManager.getIcon(
                         "Table.naturalSortIcon");
                     break;
                 }
            }