[英]Inconsistent behavior when editing JTable
我想創建一個具有以下屬性的JTable:
我試圖通過將一個項目添加到DefaultCellEditor的文本字段的ActionMap中來實現最后一個項目。 這按以下順序工作:
但是,如果我通過選項卡導航到任何其他單元格,請編輯該單元格,然后單擊Enter,這將不起作用。 僅當我在通過點擊開始編輯的單元格中按Enter鍵時,才會觸發該操作。 如果我通過按Tab鍵或使用箭頭鍵進入該單元格,它將無法正常工作。
我認為也許焦點仍然集中在我開始編輯的單元上? 我注意到,如果我單擊/編輯/制表幾次,然后在按Enter鍵之前單擊當前編輯的單元格,那似乎可行。
選項卡是否將用戶帶到下一個單元格而不轉移焦點? 任何幫助,將不勝感激。
package jtabletest;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.DefaultCellEditor;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class JTableKeyMap {
public static void main(String[] args) {
SwingUtilities.invokeLater(JTableKeyMap::createAndDisplayGui);
}
public static void createAndDisplayGui() {
final JTable table = new JTable(4, 4);
final JTextField cell = new JTextField();
final DefaultCellEditor cellEditor = new DefaultCellEditor(cell);
cellEditor.setClickCountToStart(1);
table.setDefaultEditor(Object.class, cellEditor);
KeyStroke enterKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
String enterText = "enterKeyPressed";
final InputMap iMap = cell.getInputMap(JComponent.WHEN_FOCUSED);
iMap.put(enterKeyStroke, enterText);
AbstractAction action = new AbstractAction() {
@Override
public void actionPerformed(final ActionEvent e) {
System.out.println("Callback for key event");
cellEditor.stopCellEditing();
}
};
ActionMap aMap = cell.getActionMap();
aMap.put(enterText, action);
aMap.put(KeyEvent.getKeyText(KeyEvent.VK_ENTER), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Callback for key event");
cellEditor.stopCellEditing();
}
});
JScrollPane scrollPane = new JScrollPane(table);
final JFrame frame = new JFrame("Table Test");
frame.setContentPane(scrollPane);
frame.setPreferredSize(scrollPane.getPreferredSize());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
創建JTable時添加以下內容:
table.setSurrendersFocusOnKeystroke(true);
如果您僅在單元格具有焦點時才開始輸入,這將使編輯器具有焦點。 然后,編輯器將響應您的按鍵綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.