java - 如何在 Swing 中将键绑定(bind)设置为可编辑 JTable?

标签 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;
    }
}

感谢您的帮助!

最佳答案

我已经测试了您的代码并进行了一些更改,如下所述。现在一切正常。

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;
    }
}

关于java - 如何在 Swing 中将键绑定(bind)设置为可编辑 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968748/

相关文章:

java - 格式化 100 以下的数字,前面加 0

java - 如何附加 BorderLayout 的西边和东边?

java - JTable 标题未设置

java - 在 JTable 列中显示多行文本

java - 获取 JTable 中选择监听器的列表

java - 如何将数据转换为二维数组并放入表中

java - 为什么当我使用 BigDecimal 时它会不断舍入

Java:从遥远的对象访问方法的最佳方式

java - 如何禁用 JPanel 的自动调整大小?

java - 获取 Applet 未初始化错误