代码之家  ›  专栏  ›  技术社区  ›  Jeff Holt

配置jtable,以便仅当mouseEvent没有修饰符时触发排序

  •  1
  • Jeff Holt  · 技术社区  · 5 年前

    JTable.setAutoCreateRowSorter 创建一个 TableRowSorter 除了一件事外,它还可以很好地工作:即使在 MouseEvent . 我是在加了Rob的 TableColumnManager . 当你点击(macos上的control+button1)时, JTableHeader ,您将看到排序发生在列选择器弹出窗口弹出之前。如果有任何修改,我根本不想触发排序。

    有没有简单的方法 MouseAdapter 只有当 鼠标事件 没有修饰符(特别是元修饰符)?我不想把列选择器放在应用程序中其他不太明显的地方。

    下面是我的MCV示例(抱歉没有发布Rob的课程,请参见上面的链接)。您可以测试鼠标修改器的行为(即证明行排序器忽略了修改器),而无需参考 TableColumnManager .

    import javax.swing.*;
    public class SorterChooser {
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("SorterChooser");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Object[][] data = { {"a", "1"}, {"b", "3"}, {"c", "2"}, {"d", "4"} };
            String[] colnames = { "c1", "c2" };
            JTable tab = new JTable(data, colnames);
            JScrollPane sp = new JScrollPane(tab);
            tab.setAutoCreateRowSorter(true);
            new TableColumnManager(tab, true); // comment this out to demo mouse behavior
            frame.getContentPane().add(sp);
            frame.pack();
            frame.setVisible(true);
        }
        public static void main (String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    
    • 我的意思是,它处理模型更改和我需要的许多其他事情(例如,一些列不允许排序)。
    1 回复  |  直到 5 年前
        1
  •  0
  •   Jeff Holt    5 年前

    我所做的是延长 BaseTableHeaderUI . 我如何发现扩展它是我需要做的,这是最困难的部分:

    1. 增加了一个 RowSorterListener JTable.getRowSorter
    2. 打印调用堆栈的时间 sorterChanged 被称为
    3. 调用堆栈将责任推到 javax.swing.plaf.basic.BasicTableHeaderUI 用于排序事件
    4. 找到的源代码 BasicTableHeaderUI
    5. 排序仅由执行 BasicTableHeaderUI.MouseInputHandler
    6. 扩展的 basicTableHeaderUI.mouseInputHandler 仅当没有修饰符时才调用它的super
    7. 摆好桌子 JTableHeaderUI 到新班级

    这是修改过的 SorterChooser.java :

    import javax.swing.*;
    public class SorterChooser {
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("SorterChooser");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Object[][] data = { {"a", "1"}, {"b", "3"}, {"c", "2"}, {"d", "4"} };
            String[] colnames = { "c1", "c2" };
            JTable tab = new JTable(data, colnames);
            tab.getTableHeader().setUI(new SorterChooserTableHeaderUI());  // new code
            JScrollPane sp = new JScrollPane(tab);
    
            tab.setAutoCreateRowSorter(true);
            new TableColumnManager(tab, true);
    
            frame.getContentPane().add(sp);
            frame.pack();
            frame.setVisible(true);
        }
        public static void main (String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    这是扩展的 BasicTableHeaderUI.java :

    import java.awt.event.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import javax.swing.plaf.basic.BasicTableHeaderUI;
    
    public class SorterChooserTableHeaderUI extends BasicTableHeaderUI {
    
        public class MouseInputHandler extends BasicTableHeaderUI.MouseInputHandler {
            public void mouseClicked (MouseEvent ev) {
                if (ev.getModifiersEx() == 0)
                    super.mouseClicked(ev);
            }
        }
    
        @Override
        protected MouseInputListener createMouseInputListener () {
            return new MouseInputHandler();
        }
    
    }