java - JTable - 使标题之一在单击时表现不同

标签 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)); 

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

最佳答案

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);

同样,如果您想在特定列上指定事件,例如 ID 为 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");
      }

      }


});

编辑:

但是,我理解你错了(在单击其中一个列标题时,您希望表格未排序并执行其他操作),但正如 @camickr 已经明确表示的那样,请使用:sorter .setSortable(索引, boolean 值)

更正式地说,用于关闭具有列标识符的特定列的排序,例如“bColumnName”:

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

禁用对具有标识符“bColumnName”的列的排序。

关于java - JTable - 使标题之一在单击时表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770676/

相关文章:

java - 从 maven-checkstyle-plugin 扫描中排除 *target* 目录

java - JButton 上的多个dispatchEvent 调用

java - 如何让 IntelliJ 的 GUI 构建器设置组件名称

java - 将 JTextComponent 和 JComboBox 放入 JTable

java - 从 Android 应用程序将数据插入 MySQL 数据库。更改未反射(reflect)在数据库中

java - 包私有(private)访问修饰符

java - 如何在Java代码中使用Android .so库?

java - 无法从主类启动另一个窗口

java - JCombobox 字符串项(可见)和整数键(固有)

java - 如何使用绑定(bind)类通过代码将 JComboBox selectedItem 绑定(bind)到 Jtable?