【问题标题】:JTable method called when sorting by column按列排序时调用的 JTable 方法
【发布时间】:2011-09-04 15:27:49
【问题描述】:

当用户单击列标题对相关列进行排序时,JTable(或相关类)中是否有任何方法被调用? 我想在用户单击列标题时执行一些操作,然后再开始排序操作。这可能吗?

【问题讨论】:

    标签: java swing sorting jtable


    【解决方案1】:

    在 Java5 中,您将继承 BasicTableHeaderUI 并覆盖 createMouseInputListener(),它为此目的被声明为 protected 以返回自定义侦听器

    在Java6中很多swing已经改变,不知道它是如何完成的。

    【讨论】:

      【解决方案2】:

      javax.swing.RowFilter

      import java.awt.*;
      import java.awt.event.ActionEvent;
      import javax.swing.*;
      import javax.swing.UIManager.LookAndFeelInfo;
      import javax.swing.event.*;
      import javax.swing.table.*;
      
      public class TestTableRowTable {
      
          public static void main(String[] args) {
              EventQueue.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      try {
                          // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                          for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                              if (info.getName().equals("Nimbus")) {
                                  UIManager.setLookAndFeel(info.getClassName());
                                  break;
                              }
                          }
                      } catch (Exception e1) {
                          e1.printStackTrace();
                      }
      
                      final JTable table = new JTable(10, 6);
                      for (int i = 0; i < table.getRowCount(); i++) {
                          table.setValueAt(i, i, 0);
                      }
                      final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
                      table.setRowSorter(sorter);
                      final AbstractTableModel model = new AbstractTableModel() {
      
                          private static final long serialVersionUID = 1L;
      
                          @Override
                          public int getColumnCount() {
                              return 1;
                          }
      
                          @Override
                          public Object getValueAt(int row, int column) {
                              return table.convertRowIndexToModel(row);
                          }
      
                          @Override
                          public int getRowCount() {
                              return table.getRowCount();
                          }
                      };
                      JTable headerTable = new JTable(model);
                      headerTable.setShowGrid(false);
                      headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                      headerTable.setPreferredScrollableViewportSize(new Dimension(30, 0));
                      headerTable.getColumnModel().getColumn(0).setPreferredWidth(30);
                      headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
      
                          @Override
                          public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      
                              boolean selected = table.getSelectionModel().isSelectedIndex(row);
                              Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2);
                              ((JLabel) component).setHorizontalAlignment(JLabel.CENTER);
                              if (selected) {
                                  component.setFont(component.getFont().deriveFont(Font.BOLD));
                              } else {
                                  component.setFont(component.getFont().deriveFont(Font.PLAIN));
                              }
                              return component;
                          }
                      });
                      table.getRowSorter().addRowSorterListener(
                              new RowSorterListener() {
      
                                  @Override
                                  public void sorterChanged(RowSorterEvent e) {
                                      model.fireTableDataChanged();
                                  }
                              });
                      table.getSelectionModel().addListSelectionListener(
                              new ListSelectionListener() {
      
                                  @Override
                                  public void valueChanged(ListSelectionEvent e) {
                                      model.fireTableRowsUpdated(0, model.getRowCount() - 1);
                                  }
                              });
                      JScrollPane pane = new JScrollPane(table);
                      pane.setRowHeaderView(headerTable);
                      JFrame frame = new JFrame("Test");
                      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                      frame.getContentPane().add(pane);
                      frame.getContentPane().add(new JButton(new AbstractAction("Toggle filter") {
      
                          private static final long serialVersionUID = 1L;
                          private RowFilter<TableModel, Object> filter = new RowFilter<TableModel, Object>() {
      
                              @Override
                              public boolean include(javax.swing.RowFilter.Entry<? extends TableModel, ? extends Object> entry) {
                                  return ((Number) entry.getValue(0)).intValue() % 2 == 0;
                                  //return ((String) entry.getValue(0)).length()>0 ;
                                  //return ((Date) entry.getValue(0)).getTime()< ;
                              }
                          };
      
                          @Override
                          public void actionPerformed(ActionEvent e) {
                              if (sorter.getRowFilter() != null) {
                                  sorter.setRowFilter(null);
                              } else {
                                  sorter.setRowFilter(filter);
                              }
                          }
                      }), BorderLayout.PAGE_END);
                      frame.pack();
                      frame.setLocationRelativeTo(null);
                      frame.setVisible(true);
                  }
              });
          }
      
          private TestTableRowTable() {
          }
      }
      

      【讨论】:

      • 哦,谢谢.. 我还在解决这个问题:stackoverflow.com/questions/6138230/…。我想知道在对表格进行排序之前可能会更改一段时间的行号,然后在排序后重置正确的行号,这可能是空行条目的解决方法。无论如何+1 :)
      • @0verbose 不要忘记,如果您将 RowFilter 设置为具体的 TableColumn,那么另一个 TableColumns 会忽略它
      • -1 这完全是错误(无论它应该做什么)......你不能(永远不会,这是一个absolute nogo) 触发虚假事件,特别是不会从侦听器到其他事件类型。如果模型在任何方面发生变化,则模型有责任这样做。如果模型没有改变,就不需要触发(它会混淆所有的听众)
      猜你喜欢
      • 2016-11-24
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多