开发者

How to remove a row in JTable via pressing on DELETE on the keyboard

开发者 https://www.devze.com 2023-03-15 06:19 出处:网络
I know that I can use KeyListener to check if DELETE (char) 127 is pressed or not, but how can I add keyListener to the selectedRow in JTable?

I know that I can use KeyListener to check if DELETE (char) 127 is pressed or not, but how can I add keyListener to the selectedRow in JTable?

EDIT:

I have tried this but it doesn't work:

myTable.addKeyListener(this);
...
public void keyPressed(KeyEvent e)
{
    if(e.getKeyCode() == 127 &&a开发者_运维技巧mp; myTable.GetSelectedRow() != -1)
    {
        btnRemove.doClick(); // this will remove the selected row in JTable
    }
}


One issue with KeyListeners is that the component being listened to must have the focus. One way to get around this is to use Key Bindings.

e.g.,

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


You don't need to add one to the row. Just add one listener to the table and have it ask the table which row is selected.

You can also try keyTyped instead of keyPressed. Some platforms have had issues where one works and the other doesn't.

If you wanted to let users configure their key bindings you could as @hovercraft suggested and use key bindings. It requires mapping a KeyStroke to an action name with their InputMap and mapping the action names to Actions with their ActionMap.

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


You add the KeyListener to the JTable as follows:

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

For deleting selected rows, you may check out this answer.

0

精彩评论

暂无评论...
验证码 换一张
取 消