2012-08-06 55 views
1

添加以下代码作为一个监听JTableHeader的:JTable中选择所有轮班行

 header.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      JTableHeader header = (JTableHeader) e.getSource(); 
      JTable table = header.getTable(); 
      TableColumnModel columnModel = table.getColumnModel(); 
      int vci = columnModel.getColumnIndexAtX(e.getX()); 
      int mci = table.convertColumnIndexToModel(vci); 
      if (mci == targetColumnIndex) { 
       TableColumn column = columnModel.getColumn(vci); 
       Object v = column.getHeaderValue(); 
       boolean b = Status.DESELECTED.equals(v) ? true : false; 
       TableModel m = table.getModel(); 
       for (int i = 0; i < m.getRowCount(); i++) m.setValueAt(b, i, mci); 
       column.setHeaderValue(b ? Status.SELECTED : Status.DESELECTED); 
       //header.repaint(); 
      } 
     } 
    }); 

如果我手动选择多个单元中的一个,然后如果单击ckeckAll头,该代码执行,然后将视觉行的顺序正在改变,所选择的跳转到底部/顶部。有任何想法吗?

回答

2

TableHeader S IN一个JTable已经内置在他们侦听器排序基础上,为Comparator存储在该列中的特定Object类型的值。

您正在为该表添加第二个侦听器,而不是覆盖内置的侦听器。所以你看到了这两种行为的影响。

更新

如果你不希望任何排序功能,您可以禁用行排序,或者只是实现自己的。您也可以实施自己的自定义TableColumn

+0

我可以以某种方式禁用初始,排序吗?或者如果没有,还有其他的方法来停止排序? – Bober02 2012-08-06 17:35:50

+0

我已经更新了我的答案,我从来没有这样做过,但我绝对肯定它可能。 – 2012-08-06 17:44:41