JTable - заставить один из заголовков вести себя по-разному при клике

У меня есть простой 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)); 

Когда я нажимаю на заголовок столбца, он будет попеременно сортироваться по возрастанию и по убыванию. Я хотел бы добавить еще один заголовок столбца, который будет действовать по-другому при нажатии, при этом другие заголовки сохраняют свое поведение. Как бы Вы это сделали?

3 ответа

Решение

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. Отключить сортировку по конкретному столбцу. Это делается с помощью setSortable(column, false) метод DefaultRowSorter,

  2. Включите другое действие при нажатии на заголовок таблицы. Это делается путем добавления MouseListener в заголовок таблицы.

Вы должны были бы реализовать свой собственный RowSorter и в toggleSortOrder Для этого вам нужно разрешить вашему столбцу с четырьмя параметрами переключаться на новый вид, который не будет у других столбцов.

Для обновления дисплея вы можете расширить 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;
                 }
            }
Другие вопросы по тегам