Swing的JTable默认Tab键为横向移动单元格焦点,Enter键为纵向移动单元格焦点。在实际使用时不符合我们的操作习惯,而网上很多文章只是点到为止,没有详细说明。
经过自己的不断试验,以下代码实现了在表格中,用Enter键代替Tab键的功能,且焦点会自动跳过不能编辑的单元格。
/*
* 内部类,移动单元格焦点,当下一个单元格不能编辑时则跳过,直到移动到可编辑的焦点。
* 如果焦点为最后一行最后一列,则新焦点移动到第一行第一列。
*/
class TableAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
selCol = InsertTable.this.getSelectedColumn();
selRow = InsertTable.this.getSelectedRow();
rowCount = InsertTable.this.getRowCount();
columnCount = InsertTable.this.getColumnCount();
/*
* 如果移动后的新单元格不能编辑则继续循环,直到新单元格可编辑则跳出循环。
* selCol和selRow的值为新行列值
*/
do {
if (selCol == columnCount - 1) {
if (selRow == rowCount - 1) {
selRow = 0;
selCol = 0;
} else {
selRow += 1;
selCol = 0;
}
} else {
selCol += 1;
}
} while (!InsertTable.this.isCellEditable(selRow, selCol));
/*
* 如果因为各种原因(主要是原单元格编辑器的stopCellEditing方法返回false)导致
* 新焦点单元格不能启动编辑,则焦点任停留在原单元格。
* 否则将移动到新单元格。
*/
if (InsertTable.this.editCellAt(selRow, selCol)) {
InsertTable.this.changeSelection(selRow, selCol, false, false);
}
}
}
在继承JTable的类构造方法中添加如下代码,这样在创建实例时可保证Enter键代替Tab键的功能。
public class InsertTable extends JTable {
public InsertTable() {
super.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("ENTER"), "moveFocus");
super.getActionMap().put("moveFocus", new TableAction());
}
注意:如果表格中的单元格都不能编辑,将按键映射放在构造方法中会造成死循环。
建议最好是将按键映射设为独立方法,在表格构造时根据实际情况确定是否启用