【问题标题】:How to remove a row in JTable via pressing on DELETE on the keyboard如何通过按键盘上的 DELETE 删除 JTable 中的一行
【发布时间】:2011-09-21 17:08:22
【问题描述】:

我知道我可以使用 KeyListener 来检查是否按下了 DELETE (char) 127,但是如何将 keyListener 添加到 JTable 中的 selectedRow 中?

编辑:

我试过了,但是不行:

myTable.addKeyListener(this);
...
public void keyPressed(KeyEvent e)
{
    if(e.getKeyCode() == 127 && myTable.GetSelectedRow() != -1)
    {
        btnRemove.doClick(); // this will remove the selected row in JTable
    }
}

【问题讨论】:

  • getSelectedRow() 中应该是小写的“g”。 btnRemove.doClick() 是做什么的?
  • @bemace 我定义了自己的GetSelectedRow() 方法
  • 好吧,你的问题。股票有什么问题?
  • @bemace 实际上,我使用的是自定义表,所以我必须定义新的 GetSelectedRow() 方法
  • 如果您有一个使用非标准方法名称的完全自定义 JTable,那么问题出在您发布的 5 行中的可能性不是很好。

标签: java jtable keylistener


【解决方案1】:

您无需在行中添加一个。只需向表中添加一个侦听器并让它询问表选择了哪一行。

您也可以尝试用keyTyped 代替keyPressed。有些平台存在一个有效而另一个无效的问题。

如果您想让用户配置他们的键绑定,您可以按照@hovercraft 的建议使用键绑定。它需要将KeyStroke 映射到带有InputMap 的动作名称,并将动作名称映射到带有ActionMapActions。

table.getInputMap().put(KeyStroke.getKeyStroke("DELETE"),
                        "deleteRow");
table.getActionMap().put("deleteRow", yourAction);

【讨论】:

  • 其实我自己,我会使用键绑定。
【解决方案2】:

KeyListeners 的一个问题是被监听的组件必须有焦点。解决此问题的一种方法是使用键绑定。

例如,

  // assume JTable is named "table"
  int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
  InputMap inputMap = table.getInputMap(condition);
  ActionMap actionMap = table.getActionMap();

  // DELETE is a String constant that for me was defined as "Delete"
  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), DELETE);
  actionMap.put(DELETE, new AbstractAction() {
     public void actionPerformed(ActionEvent e) {
        // TODO: do deletion action here
     }
  });

【讨论】:

  • 你能给我一个使用键绑定的例子吗?
  • @Eng:见上文,但更重要的是,请参阅有关此主题的 Swing 教程
  • +1,但我会使用 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT。不确定确切的区别,但默认绑定使用 this 或 WHEN_FOCUSED。请参阅键绑定 (tips4java.wordpress.com/2008/10/10/key-bindings)。
【解决方案3】:

您将KeyListener 添加到JTable,如下所示:

table.addKeyListener(new KeyAdapter()
{
    @Override
    public void keyReleased(KeyEvent keyEvent)
    {
        considerDeletingSelectedRows(keyEvent, table);
    }
});

private void considerDeletingSelectedRows(KeyEvent keyEvent, JTable table)
{
    int keyCode = keyEvent.getKeyCode();
    int[] selectedRows = table.getSelectedRows();
    int selectedRowsCount = selectedRows.length;
    if (keyCode == KeyEvent.VK_DELETE && selectedRowsCount > 0)
    {
        // Perform actual row deletion
    }
}

要删除选定的行,您可以查看this 答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多