Проблема
Мне нужны возможности JXTable с поведением «выбрать все при редактировании» RXTable а>. Выполнение простого переопределения было бы хорошо, но функция двойного щелчка RXTable не работает с JXTable. При использовании режима действия кнопки все в порядке, но при использовании F2 или двойном щелчке чего-либо в JXTable происходит конфликт с RXTable и удаляется выбор, поэтому я остаюсь с поведением по умолчанию. Это из-за GenericEditor, который он использует внутри, или это что-то еще?
Как я могу заставить JXTable выбрать все на F2 или дважды щелкнуть по редактированию?
РЕДАКТИРОВАТЬ: похоже, это происходит только тогда, когда в модели есть столбец, определенный для типа Integer. Он работает должным образом, если он определен для столбца String или Object.
Решение
Благодаря исправлению kleopatra я смог изменить метод selectAll, чтобы он обрабатывал поля JFormattedTextField и все случаи редактирования. Поскольку исходный код работал над типом для редактирования, я просто использовал исправление для других случаев. Вот что у меня получилось.
Замените selectAll в RXTable следующим:
/*
* Select the text when editing on a text related cell is started
*/
private void selectAll(EventObject e)
{
final Component editor = getEditorComponent();
if (editor == null
|| ! (editor instanceof JTextComponent
|| editor instanceof JFormattedTextField))
return;
if (e == null)
{
((JTextComponent)editor).selectAll();
return;
}
// Typing in the cell was used to activate the editor
if (e instanceof KeyEvent && isSelectAllForKeyEvent)
{
((JTextComponent)editor).selectAll();
return;
}
// If the cell we are dealing with is a JFormattedTextField
// force to commit, and invoke selectall
if (editor instanceof JFormattedTextField) {
invokeSelectAll((JFormattedTextField)editor);
return;
}
// F2 was used to activate the editor
if (e instanceof ActionEvent && isSelectAllForActionEvent)
{
((JTextComponent)editor).selectAll();
return;
}
// A mouse click was used to activate the editor.
// Generally this is a double click and the second mouse click is
// passed to the editor which would remove the text selection unless
// we use the invokeLater()
if (e instanceof MouseEvent && isSelectAllForMouseEvent)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
((JTextComponent)editor).selectAll();
}
});
}
}
private void invokeSelectAll(final JFormattedTextField editor) {
// old trick: force to commit, and invoke selectall
editor.setText(editor.getText());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
editor.selectAll();
}
});
}