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

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

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

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

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

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

更多关于这个线程和例子

谢谢n00213f。 post中的post和示例很有帮助。 通过在线程中暗示的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(); } }; 

这是我为我正在处理的项目整理的代码片段。 代码已针对在第一列和最后一列中具有不可编辑单元格的表进行测试和validation。 该类将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));