Как удалить строку в JTable, нажав клавишу DELETE на клавиатуре - PullRequest
2 голосов
/ 24 июня 2011

Я знаю, что могу использовать KeyListener, чтобы проверить, нажата ли кнопка DELETE (char) 127 или нет, но как я могу добавить keyListener к selectedRow в JTable?

EDIT:

Я пробовал это, но это не работает:

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

Ответы [ 3 ]

11 голосов
/ 24 июня 2011

Одна проблема с 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
     }
  });
3 голосов
/ 24 июня 2011

Вам не нужно добавлять один в строку. Просто добавьте одного слушателя в таблицу и попросите таблицу выбрать, какая строка выбрана.

Вы также можете попробовать keyTyped вместо keyPressed. У некоторых платформ были проблемы, когда одна работает, а другая нет.

Если вы хотите разрешить пользователям настраивать привязки клавиш, вы можете, как предложил @hovercraft, использовать привязки клавиш. Требуется сопоставить KeyStroke с именем действия с их InputMap и сопоставить имена действий с Action s с их ActionMap.

table.getInputMap().put(KeyStroke.getKeyStroke("DELETE"),
                        "deleteRow");
table.getActionMap().put("deleteRow", yourAction);
0 голосов
/ 25 марта 2019

Вы добавляете 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
    }
}

Для удаления выбранных строк вы можете проверить этот ответ.

...