有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在swing中将键绑定设置为可编辑JTable?

我想通过只按Delete按钮来删除选中的JTable

当我按下Delete时,所选单元格将变为可编辑,我的操作(在jframe上)不会收到KeyEvent

请运行此演示以查看效果:

public class TestTableKeyBinding extends JFrame {

    // private static final int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
    private JTable table;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TestTableKeyBinding test = new TestTableKeyBinding();
                test.setVisible(true);
            }
        });
    }

    TestTableKeyBinding() {
        super();
        initUI();
        addKeyBindings();
    }

    private void initUI() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String[] headers = new String[] { "apples", "bananas" };
        String[][] data = new String[][] { { "1", "2" }, { "4", "6" }, { "5", "7" }, { "1", "3" }, { "2", "11" } };
        table = new JTable(data, headers);
        table.setRowSelectionAllowed(true);     
        this.add(new JScrollPane(table));
        this.pack();
        this.setSize(new Dimension(300, 400));

    }

    private void addKeyBindings() {
        // root maps
        InputMap im = this.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        ActionMap am = this.getRootPane().getActionMap();
        // add custom action
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "save");
        am.put("save", saveAction());
    }

    private AbstractAction saveAction() {
        AbstractAction save = new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered.");
                table.editingCanceled(null);
                table.editingStopped(null);
                int selectedRow = table.getSelectedRow();
                if (selectedRow != -1) {
                    ((DefaultTableModel) table.getModel()).removeRow(selectedRow);
                }
            }
        };
        return save;
    }
}

谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    我已经测试了你的代码,并做了如下所述的一些更改。现在它工作得很好

    private void addKeyBindings() {
        KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
        table.getActionMap().put("save", saveAction());
        table.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "save");
    }
    

    再做一次如下所述的改变

    table = new JTable(new DefaultTableModel(data,headers));
    

    否则它将导致ClassCastException在下面的行

    ((DefaultTableModel) table.getModel()).removeRow(selectedRow);
    

    以下是完整的代码:

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.KeyStroke;
    import javax.swing.table.DefaultTableModel;
    
    public class TestTableKeyBinding extends JFrame {
    
        private JTable table;
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TestTableKeyBinding test = new TestTableKeyBinding();
                    test.setVisible(true);
                }
            });
        }
    
        TestTableKeyBinding() {
            super();
            initUI();
            addKeyBindings();
        }
    
        private void initUI() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            String[] headers = new String[] { "apples", "bananas" };
            String[][] data = new String[][] { { "1", "2" }, { "4", "6" }, { "5", "7" }, { "1", "3" },
                    { "2", "11" } };
            table = new JTable(new DefaultTableModel(data,headers));
            table.setRowSelectionAllowed(true);
            this.add(new JScrollPane(table));
            this.pack();
            this.setSize(new Dimension(300, 400));
    
        }
    
        private void addKeyBindings() {
            KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
            table.getActionMap().put("save", saveAction());
            table.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "save");
        }
    
        private AbstractAction saveAction() {
            AbstractAction save = new AbstractAction() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered.");
                    table.editingCanceled(null);
                    table.editingStopped(null);
                    int selectedRow = table.getSelectedRow();
                    if (selectedRow != -1) {
                        ((DefaultTableModel) table.getModel()).removeRow(selectedRow);
                    }
                }
            };
            return save;
        }
    }