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

10

这可能有一个简单的解决方案,但我已经无计可施了,所以希望有人可以帮助一下。

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

但是,这对我似乎不起作用。在用户点击单元格之前,只显示JLabel。
只有当用户双击单元格时才会显示JSpinner(即CellEditor)。因此,它看起来像单元格仅在MouseEvents上进入“edit”模式,而没有焦点时。

如何使单元格一旦获得焦点就进入编辑模式?

3个回答

21

非常感谢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();
            }
  };

为什么不使用this关键字? - BrainSlugs83

6
您可以通过编程实现此操作,只需监听单元格上的焦点事件,在焦点和允许编辑时开始编辑。
更多信息请查看本帖子示例

3

这是我为一个项目编写的代码片段。该代码已经过测试,适用于第一列和最后一列包含不可编辑单元格的表格。该类限制标签只能在表格的可编辑单元格中进行。它还支持按下Shift+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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接