Используйте клавишу Enter. Действуйте как клавиша Tab на jTable.
Я застрял в своем проекте на 2 дня. Я не могу понять, как заставить клавиатуру ENTER действовать как клавиша TAB. Я пробовал прослушивать клавиши, но клавиша ENTER KEY имеет функцию по умолчанию для JTable, поэтому она не работает, она продолжает двигаться вниз. Я обнаружил, что мне нужно использовать связывание ключей, но я не могу его реализовать.
Кто-нибудь может дать мне полный кодовый пример этого на JTable??? Пожалуйста, вам нужна помощь.
заранее спасибо
3 ответа
Основной изюминкой было бы использование API привязки клавиш, который позволит вам в большинстве случаев переопределить стандартные ключи поведения во многих компонентах.
Этот пример в основном применяет одноименное действие к клавишам Enter и Tab, что позволяет легко изменять их поведение с помощью одного Action
,
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class Test101 {
public static void main(String[] args) {
new Test101();
}
public Test101() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable table = new JTable();
InputMap im = table.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Action.NextCell");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextCell");
ActionMap am = table.getActionMap();
am.put("Action.NextCell", new NextCellActioin(table));
DefaultTableModel model = new DefaultTableModel(10, 10);
table.setModel(model);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class NextCellActioin extends AbstractAction {
private JTable table;
public NextCellActioin(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e) {
int col = table.getSelectedColumn();
int row = table.getSelectedRow();
int colCount = table.getColumnCount();
int rowCount = table.getRowCount();
col++;
if (col >= colCount) {
col = 0;
row++;
}
if (row >= rowCount) {
row = 0;
}
table.getSelectionModel().setSelectionInterval(row, row);
table.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
}
}
}
Функциональность Tab контролируется изменением поведения фокуса по умолчанию, насколько я помню, с помощью диспетчера фокуса
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(enter, im.get(tab));
Вы можете указать поведение на карте действий и карте ввода JTable
:
InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Object actionKey = new Object();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), actionKey);
table.getActionMap().put(actionKey, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
// Do something for ENTER
}
});
Поведение по умолчанию, о котором вы говорите, присутствует в карте действий, инициализированной по умолчанию.