JTable - 按Tab键使单元格进入编辑模式

时间:2010-06-10 09:26:52

标签: java swing jtable

这可能是一个微不足道的解决方案,但我在我的系绳的最后,所以我希望有人可以提供帮助。

我使用一个JTable,它有一个自定义渲染器和一组列的自定义编辑器 渲染器使用JLabel组件,编辑器使用JSpinner组件 我们的用户希望能够在列中输入值,然后按TAB或ENTER移动到表格中的下一个可编辑单元格。
如果我理解正确,这是JTable的默认行为。

但是,这对我来说似乎不正常。在用户单击单元格之前,仅显示JLabel 只有当用户双击单元格时才会显示JSpinner(即CellEditor)。因此,看起来单元格仅在MouseEvents上进入“编辑”模式,但在有焦点时则不然。

如果单元格有焦点,如何让单元格进入编辑模式?

3 个答案:

答案 0 :(得分:19)

谢谢你n00213f。帖子中的帖子和示例很有帮助。通过在线程中暗示的JTable中重载 changeSelection 方法,JTable会在每次更改选择时检查单元格是否可编辑。如果单元格是可编辑的,它将显示CellEditor并将焦点转移到编辑器组件。

为了完整起见,这是我的解决方案:

  JTable myTable = new javax.swing.JTable()
  {
            public void changeSelection(final int row, final int column, boolean toggle, boolean extend)
            {
                super.changeSelection(row, column, toggle, extend);
                myTable.editCellAt(row, column);
                myTable.transferFocus();
            }
  };

答案 1 :(得分:5)

您可以以编程方式实现此目的,只需在单元格上进行焦点事件,在焦点和编辑允许的情况下,开始编辑。

有关此threadexample

的更多信息

答案 2 :(得分:2)

这是我为我正在处理的项目整理的代码片段。代码已针对在第一列和最后一列中具有不可编辑单元格的表进行测试和验证。该类将Tab键限制为仅表格的可编辑单元格。它还支持反向切换到制表符。

public class JTableCellTabbing {
/**
 * 
 * Creates a new {@code JTableCellTabbing} object.
 *
 *
 */
private JTableCellTabbing() {        
}

/**
 * 
 * Set Action Map for tabbing and shift-tabbing for the JTable
 *
 *
 * @param theTable - Jtable with NRows and MCols of cells
 * @param startRow - valid start row for tabbing [ 0 - (numRows-1) ]
 * @param numRows - Number of rows for tabbing
 * @param startCol - valid start col for tabbing [ 0 - (numCols-1) ]
 * @param numCols -  Number of columns for tabbing
 */
@SuppressWarnings("serial")
static public void setTabMapping(final JTable theTable, final int startRow, final int numRows, final int startCol, final int numCols) {
    if (theTable == null) {
        throw new IllegalArgumentException("theTable is null");
    }

    // Calculate last row and column for tabbing
    final int endRow = startRow + (numRows - 1);
    final int endCol = startCol + (numCols - 1);

    // Check for valid range
    if ((startRow > endRow) || (startCol > endCol)) {
        throw new IllegalArgumentException("Table Size incorrect");            
    }

    // Get Input and Action Map to set tabbing order on the JTable
    InputMap im = theTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    ActionMap am = theTable.getActionMap();

    // Get Tab Keystroke
    KeyStroke tabKey = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);                    
    am.put(im.get(tabKey), new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int row = theTable.getSelectedRow();
            int col = theTable.getSelectedColumn();

            col++;

            // Move to next row and left column
            if (col > endCol) {
                col = startCol;
                row++;
            }

            // Move to top row
            if (row > endRow ) {
                row = startRow;
            }

            // Move cell selection
            theTable.changeSelection(row, col, false, false);
        }            
    });

    // Get Shift tab Keystroke
    KeyStroke shiftTab = 
        KeyStroke.getKeyStroke(KeyEvent.VK_TAB, java.awt.event.InputEvent.SHIFT_DOWN_MASK);                    
    am.put(im.get(shiftTab), new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int row = theTable.getSelectedRow();
            int col = theTable.getSelectedColumn();

            col--;

            // Move to top right cell
            if (col < startCol) {
                col = endCol;
                row--;
            }

            // Move to bottom row
            if (row < startRow ) {
                row = endRow;
            }

            // Move cell selection
            theTable.changeSelection(row, col, false, false);
        }            
    });                    
}

}

以下是这个班级用于你的桌子的方式:

JTable myTable = new JTable();
// Set up table attributes....
JTableCellTabbing.setTabMapping(myTable, 0, NUM_ROWS, 1, (NUM_COLS-1));