以编程方式启用在击键时编辑JTable单元

时间:2013-11-08 04:18:32

标签: java swing jtable key-bindings

我想在密钥上编辑JTable单元,比如F2。

我知道默认情况下双击会启用编辑功能,但有没有办法将该事件绑定到某个键?我尝试了这个链接JTable edit on keypress,但它对我不起作用。

这是我的代码:

public class DatabaseJTable extends JTable implements MouseListener {
    public DatabaseJTable(Object [][] data, Object [] columnNames) {
        super(data, columnNames);
        InputMap inputMap = this.getInputMap(JComponent.WHEN_FOCUSED);
        ActionMap actionMap = this.getActionMap();
        this.addMouseListener(this);

    // bind edit record to F2 key
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), "edit");
        actionMap.put("edit", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                // TODO Auto-generated method stub
                DatabaseJTable table = (DatabaseJTable)ae.getSource();
                table.changeSelection(table.getSelectedRow(), 1, false, false);
                table.editCellAt(table.getSelectedRow(), 1);
                System.out.println("F2 pressed");
            }
        });
    // binding delete record to Delete key
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "delete");
        actionMap.put("delete", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                // TODO Auto-generated method stub

            }
        });
    }

    @Override
    public boolean isCellEditable(int row, int column) {
       return false;
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:4)

F2已经是JTable用来开始编辑的默认KeyStroke。

请参阅Key Bindings以获取所有组件使用的所有KeyStrokes的表。您还可以找到使用键绑定的示例。

如果您确实创建了自己的Action,而不是使用提供Action,那么代码应该是:

int row = table.getSelectedRow();
int column = table.getSelectedColumn();

if (editCellAt(row, column))
{
    Component editor = table.getEditorComponent();
    editor.requestFocusInWindow();
}

因此,一旦按下键,编辑器就会获得焦点。

显然,Aqua LAF不绑定F2所以看起来你需要自己动手。假设在ActionMap中定义了“startEditing”Action,您可以使用:

KeyStroke keyStroke = KeyStroke.getKeyStroke("F2");
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(keystroke, "startEditing");