2011-08-04 58 views
2

我想根据一个隐藏列对JTable行进行排序。JTable基于隐藏列排序

说我有一个JTable这样

column1 column2 
val1  val2 

现在我有一个隐藏在一个更栏3,我不希望展示。当用户点击Column2时,它应该根据Column3(隐藏列)而不是基于Column2对行进行排序。

如何在JTable中实现这一点?

+1

试图混淆你的用户;-) – kleopatra

回答

2

您可以通过默认TableRowSorterJTable添加,但有RowSorter,没有什么更好,清除四周,达里尔的Multisort Table Header Cell Renderer对RowSorter的

注定义只适用于具体的TableColumn

赛普尔例如(使用少再次balast)

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class HeaderDoubleclickTest { 

    private String[] columnNames = {"String", "Integer", "Boolean"}; 
    private Object[][] data = { 
     {"aaa", 12, true}, {"bbb", 5, false}, 
     {"CCC", 92, true}, {"DDD", 0, false} 
    }; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 
    private JTableHeader header; 

    static class TestTableRowSorter extends TableRowSorter<TableModel> { 

     TestTableRowSorter(TableModel m) { 
      super(m); 
     } 

     @Override 
     public void toggleSortOrder(int column) { 
     } 

     public void wrapToggleSortOrder(int column) { 
      super.toggleSortOrder(column); 
     } 
    } 
    private Timer timer = new Timer(400, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("single"); 
      JTable table = header.getTable(); 
      RowSorter sorter; 
      if (pt != null && table != null && (sorter = table.getRowSorter()) != null) { 
       int columnIndex = header.columnAtPoint(pt); 
       if (columnIndex != -1) { 
        columnIndex = table.convertColumnIndexToModel(columnIndex); 
        ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex); 
       } 
      } 
     } 
    }); 
    private Point pt; 

    public JComponent makeUI() { 
     timer.setRepeats(false); 
     table.setRowSorter(new TestTableRowSorter(model)); 
     header = table.getTableHeader(); 
     header.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(final MouseEvent e) { 
       if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) { 
        System.out.println("double"); 
        pt = null; 
        timer.stop(); 
       } else { 
        pt = e.getPoint(); 
        timer.restart(); 
       } 
      } 
     }); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(table)); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new HeaderDoubleclickTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

我是否需要将hiddlen列索引传递给wrapToggleSortOrder(int列)?它会根据隐藏的列进行排序吗? – u449355

+0

@Umesh:这是拦截标题点击并区分单击和双击的好例子,如果你还需要这个功能;但它不直接处理排序顺序。另请参阅此[补充方法](http://stackoverflow.com/questions/6937694/jtable-sorting-based-on-hidden-column/6939889#6939889)。 [Alpha图标] +1(http://tips4java.wordpress.com/2010/08/22/alpha-icons/)。 – trashgod

3

使用代码张贴在这里:http://www.esus.com/docs/GetQuestionPage.jsp?uid=1270

有变量/方法的参数col - 只检查其是否你COLUMN2如果是的话把它当作是你隐藏的列 - 排序并重新呈现表。

+0

+1这可能对支持旧版本有用;另见[答案](http://stackoverflow.com/questions/5798411/heads-up-on-implementing-rowsorter-and-rowfilter-java-1-4/5798542#5798542)。 – trashgod

2

一种方法是实现Comparable接口类型Column2,为s在此example中,并使用相应的Column3值进行比较。方便的话,如果Column3已经实现Comparable<Column3>,那么您可以委托给Column3,因为exampleDouble有关。