2010-06-10 3 views
9

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

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

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

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

ответ

4

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

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

18

Спасибо 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(); 
      } 
    }; 
+0

хорошо, чтобы услышать ответ был полезным. – n002213f

2

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

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)); 
Смежные вопросы