【问题标题】:Programmatically enable editing a JTable cell on keystroke以编程方式启用在击键时编辑 JTable 单元格
【发布时间】:2013-11-08 14:33:55
【问题描述】:

我想在一个键上启用编辑 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;
    }
}

提前致谢。

【问题讨论】:

    标签: java swing jtable key-bindings


    【解决方案1】:

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

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

    如果您确实创建了自己的 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");
    

    【讨论】:

    • 作为参考,com.apple.laf.AquaLookAndFeel 不会将F2(或任何键)绑定到startEditing
    • @trashgod,有意思,startEditing Action 定义了吗?
    • 感谢您提供的信息。我有一个小问题。双击单元格也会触发编辑。有没有办法禁用它,所以只有 F2 可以触发编辑?
    • @ightbringer 消耗()此鼠标事件或以某种方式覆盖它不是一个好主意,您可以将 DefaultCellEditor#setClickCountToStart(int) 更改为合理的数字 4-5,让它通过鼠标访问这个加速器事件也
    • 原因是我想双击一行以打开一个新面板,然后按 F2 编辑该行。谢谢建议,我试试看。
    猜你喜欢
    • 2014-05-27
    • 2011-11-15
    • 2011-09-27
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多