Если я правильно прочитал ваш вопрос, вы хотите, чтобы пользователь мог сразу ввести текст в ячейку, не активируя сначала редактор ячейки, т. Е. Вы хотите, чтобы любое нажатие клавиши, активировавшее ячейку, было первым символом, введенным в текстовое поле .
Моей первой попыткой было добавить propertyChangeListener в свойство focusOwner KeyboardFocusManager, только чтобы заметить, что фокус никогда не покидает JTable. Вы, вероятно, столкнулись с этим также. Время для плана Б.
Я получил эту «первую нажатие клавиши», добавив KeyListener в таблицу, которая записывает последнее KeyEvent для метода keyPressed () в поле экземпляра. Метод getTableCellEditorComponent () читает символ оттуда. Мне также нужно было, чтобы хакерский метод requestFocusInWindow () упомянул вас, если пользователь должен продолжать печатать какие-либо символы после первого.
Для моего примера приложения я создал подкласс JTable, который добавляет KeyListener к себе. Намного лучше сделать так, чтобы ваш экземпляр CellEditor реализовывал KeyListener и вместо этого добавлял его в обычный JTable, но я оставлю это вам.
Вот ваш фрагмент кода, как я его изменил:
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
container.add(field, BorderLayout.CENTER);
// Will want to add an instanceof check as well as a check on Character.isLetterOrDigit(char).
char keypressed = ((StickyKeypressTable)table).getLastKeyPressed();
field.setText(String.valueOf(keypressed));
container.add(new JButton("..."), BorderLayout.EAST);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// This needs to be in an invokeLater() to work properly
field.requestFocusInWindow();
}
});
return container;
}
Что касается мерзости, то она сидит где-то там с Вогон Поэзией, но это должно решить вашу непосредственную проблему.