且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

单击JTable Header时排序错误的列

更新时间:2023-12-03 19:08:28


  • 中的代码> RowSorterListener 是指定正确返回索引(来自 RowSorterListener s event)

    • code in RowSorterListener is designatet to returns the index correctly (from RowSorterListeners event)

      默认情况下,你永远不需要知道 JTable的订购 s视图,所有这些事件都是模型事件

      by default you never need to know ordering from JTables view, all those events are models events,

      add TableColumnModelListener 如果要跟踪 columnMoved ,则以编码方式排序的所有事件都将绘制在中JTable 正确查看

      add TableColumnModelListener in the case that you want to trace columnMoved, all events from sorting programatically are painted in JTables view correctly

      1st。没有列重新排序的attemtp,

      1st. attemtp without column reordering,

      Column NO. - 0 is sorted
      Column NO. - 1 is sorted
      Column NO. - 2 is sorted
      Column NO. - 3 is sorted
      Column NO. - 4 is sorted
      
      ... and so on
      BUILD SUCCESSFUL (total time: 21 seconds)
      


      • 第二名。尝试列重新排序(通过鼠标拖动)

      Column NO. - 0 is sorted
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      Column NO. - 1 is sorted
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnSelectionChanged from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      Column NO. - 2 is sorted
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      columnMoved from ColumnModelListener
      Column NO. - 3 is sorted
      Column NO. - 4 is sorted
      Column NO. - 0 is sorted
      Column NO. - 1 is sorted
      Column NO. - 2 is sorted
      BUILD SUCCESSFUL (total time: 10 seconds)
      




      • 第三。如果没有初始化Swing Timer并且所有事件都是由用户手提出的,那么尝试相同的正确输出

        • 3rd. attempt the same correct output if Swing Timer isn't initialized and all event are made by users hand

          例如

          import java.awt.EventQueue;
          import java.awt.event.ActionEvent;
          import java.util.Arrays;
          import java.util.List;
          import java.util.Random;
          
          import javax.swing.*;
          import javax.swing.RowSorter.SortKey;
          import javax.swing.event.*;
          import javax.swing.table.*;
          
          public class SortTest1 {
          
              private JFrame frame = new JFrame(getClass().getSimpleName());
          
              private DefaultTableModel model = new DefaultTableModel(10, 5) {
                  private static final long serialVersionUID = 1L;
          
                  @Override
                  public Class<?> getColumnClass(int column) {
                      return getValueAt(0, column).getClass();
                  }
              };
              private JTable table = new JTable(model);
              private TableRowSorter<?> sorter;
              private static final Random rnd = new Random();
              private Timer timer;
              private int columnNo = 0;
          
          
              public SortTest1() {
                  for (int row = model.getRowCount(); --row >= 0;) {
                      int i = 20 + row % 20;
                      model.setValueAt(row + " " + i, row, 0);
                      model.setValueAt(i + row, row, 1);
                      model.setValueAt(rnd.nextBoolean(), row, 2);
                      model.setValueAt(rnd.nextDouble(), row, 3);
                      model.setValueAt(row + " " + i * 1, row, 4);
                  }
                  table.setAutoCreateRowSorter(true);
                  sorter = (TableRowSorter<?>) table.getRowSorter();
                  sorter.setSortsOnUpdates(true);
                  sorter.addRowSorterListener(new RowSorterListener() {
          
                      @Override
                      public void sorterChanged(RowSorterEvent rse) {
                          if (rse.getType() == RowSorterEvent.Type.SORT_ORDER_CHANGED) {
                              List<SortKey> keys = rse.getSource().getSortKeys();
                              for (SortKey key : keys) {
                                  System.out.println("Column NO. - " + key.getColumn() + " is sorted");
                                  if (key.getColumn() == 0) {
                                      break;
                                  } else {
                                      break;
                                  }
                              }
                          }
                      }
                  });
                  frame.add(new JScrollPane(table));
                  table.setPreferredScrollableViewportSize(table.getPreferredSize());
                  table.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
                      // just handle columnMarginChanged to re-paint headings
                      @Override
                      public void columnMarginChanged(ChangeEvent e) {
                          System.out.println("columnMarginChanged from ColumnModelListener");
                      }
          
                      @Override
                      public void columnAdded(TableColumnModelEvent e) {
                          System.out.println("columnAdded from ColumnModelListener");
                      }
          
                      @Override
                      public void columnRemoved(TableColumnModelEvent e) {
                          System.out.println("columnRemovedfrom ColumnModelListener");
                      }
          
                      @Override
                      public void columnMoved(TableColumnModelEvent e) {
                          System.out.println("columnMoved from ColumnModelListener");
                      }
          
                      @Override
                      public void columnSelectionChanged(ListSelectionEvent e) {
                          System.out.println("columnSelectionChanged from ColumnModelListener");
                      }
                  });
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.pack();
                  frame.setLocationRelativeTo(null);
                  frame.setVisible(true);
                  timer = new javax.swing.Timer(1000, updateCol());
                  timer.setRepeats(true);
                  timer.start();
              }
          
              private Action updateCol() {
                  return new AbstractAction("Sort JTable") {
                      private static final long serialVersionUID = 1L;
          
                      @Override
                      public void actionPerformed(ActionEvent e) {
                          if (columnNo > 4) {
                              columnNo = 0;
                              sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(columnNo, SortOrder.ASCENDING)));              
                          } else {
                              sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(columnNo, SortOrder.ASCENDING)));
                              columnNo++;
                          }
                      }
                  };
              }
          
              public static void main(String[] args) {
                  EventQueue.invokeLater(() -> {
                      new SortTest1();
                  });
              }
          }