JTable - перевод ячейки в режим редактирования при нажатии клавиши Tab - PullRequest
9 голосов
/ 10 июня 2010

Возможно, у этого есть тривиальное решение, но я нахожусь в конце своей привязи, поэтому я надеюсь, что кто-то может помочь.

Я использую JTable, у которого есть пользовательский рендер и пользовательский редактор для наборастолбцов.
Средство визуализации использует компонент JLabel, а редактор использует компонент JSpinner.
Наши пользователи хотят иметь возможность вводить значения в столбце, а затем нажимают TAB или ENTER, чтобы перейти к следующей редактируемой ячейке втаблица.
Если я правильно понимаю, это поведение по умолчанию для JTable.

Однако, мне кажется, это не работает правильно.Пока пользователь не щелкает ячейку, отображается только JLabel.
JSpinner (т.е. CellEditor) отображается только тогда, когда пользователь дважды щелкает ячейку.Таким образом, похоже, что ячейка переходит в режим «редактирования» только в MouseEvents, но не тогда, когда она имеет фокус.

Как перевести ячейку в режим редактирования, как только она сфокусируется?

Ответы [ 3 ]

19 голосов
/ 10 июня 2010

Спасибо, n00213f. Тема и пример из вашего поста были полезны. Перегружая метод changeSelection в JTable, как было указано в потоке, 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();
            }
  };
5 голосов
/ 10 июня 2010

Вы можете достичь этого программно, вы просто слушаете события фокусировки на ячейке, фокус и редактирование разрешены, начинаете редактирование.

Подробнее об этом примере thread и

2 голосов
/ 19 июня 2013

Вот фрагмент кода, который я собрал для проекта, над которым я работал. Код был протестирован и проверен для таблицы с ячейками, которые нельзя редактировать в первом и последнем столбце. Класс ограничивает табуляцию только редактируемыми ячейками таблицы. Он также поддерживает сдвиг табуляции на вкладку в обратном порядке.

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...