JTable使用Enter键代替Tab键移动单元格焦点


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());
} 

 

注意:如果表格中的单元格都不能编辑,将按键映射放在构造方法中会造成死循环。

建议最好是将按键映射设为独立方法,在表格构造时根据实际情况确定是否启用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值