让我介绍一下我的问题。我希望在JTable中呈现数据库表的内容。有了这个JTable,我应该能够插入新行,删除行,并更新现有行的字段内容。
第一个期望的行为是,当一个单元格获得焦点时,如果它是可编辑的,它将直接进入编辑模式,如果它是一个字母数字内容,则选择所有内容。 (文字,数字,日期等)
下一个期望的行为是Enter
键用作Tab
键,即按下Enter
键焦点必须转移到下一个单元格(如果这是可编辑的)然后进入编辑模式)向前(从左到右)或向后。
为解决第一个要求,我使用以下方法覆盖JTable类的changeSelection方法。
@Override
public void changeSelection(int row, int column, boolean toggle, boolean extend) {
super.changeSelection(row, column, toggle, extend);
if (editCellAt(row, column)) {
Component editor = getEditorComponent();
editor.requestFocusInWindow();
if (editor instanceof JFormattedTextField) {
((JFormattedTextField) editor).select(0,
((JFormattedTextField) editor).getText().length());
} else if (editor instanceof JTextField) {
((JTextField) editor).selectAll();
}
}
}
在阅读了大量文档和帖子后,很明显解决问题的最合适的方法是通过使用键绑定,基本上在阅读之后,解决方案是分配{{的行为1}} Tab
键的键,所以我做了。
Enter
正如您在代码部分中看到的那样,他们被分配到private void tableConfiguration() {
//Configuramos la tabla para que en el caso de que pierda el foco finalice la edición
putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
//Cambiamos el comportamiento por defecto de la tecla enter para que actue como TAB
getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "selectNextColumnCell");
// cambiamos Shift+Enter para que se comporte como Shift+Tab
getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK),
"selectPreviousColumnCell");
//configuramos el comportamiento por defecto que queremos que tenga nuestro grid
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//seleccion simple de celda
setCellSelectionEnabled(true);//muestra la celda activa seleccionada
getTableHeader().setReorderingAllowed(false);//no permite reordenar por columnas
setRowHeight(26);//altura de la fila
}
和Enter
Shift+Enter
Tab
个键的行为。
我遇到的问题是Shift+Tab
密钥有意外行为。当单元格获得焦点时,直接进入编辑模式,当我按下Enter
键完成编辑但它没有将焦点转移到下一个单元格时,我需要再次按下Enter
得到这个的关键。 Enter
和Tab
键按预期工作,好奇,Shift+Tab
键效果也很好,完成编辑,移至上一个单元格并以编辑模式开始。< / p>
我试图按照不同的策略纠正这种行为,覆盖JTable类的方法Shift+Enter
,通过editingStopped
类,使用不同方式的监听器等,我无法做到纠正这种行为让我现在陷入困境。有人有建议或解决方案吗?我做错了什么?
问候,
答案 0 :(得分:2)
如图here所示,您可以获取与Action
相关联的原始"selectNextColumnCell"
的引用,该editingStopped()
通常与 Tab 相关联,并在您对import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.event.ChangeEvent;
public class TestTableKeyBinding {
private final String name = "selectNextColumnCell";
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new TestTableKeyBinding();
});
}
TestTableKeyBinding() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] headers = new String[]{"apples", "bananas"};
String[][] data = new String[][]{{"1", "2"}, {"3", "4"}, {"5", "6"}};
JTable table = new JTable(data, headers) {
@Override
public void editingStopped(ChangeEvent e) {
super.editingStopped(e);
this.getActionMap().get(name).actionPerformed(
new ActionEvent(this, ActionEvent.ACTION_FIRST, name));
}
};
table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), name);
table.setCellSelectionEnabled(true);
f.add(new JScrollPane(table));
f.pack();
f.setSize(new Dimension(320, 240));
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
的实施。下面的简化示例还将操作与按 Enter 相关联。结果是按 Enter 将与按 Tab 具有相同的效果,即使按键也结束编辑。
{{1}}