Проблема
Мне нужны возможности JXTable с поведением «выбрать все при редактировании» RXTable .Простое переопределение было бы хорошо, но функция двойного щелчка RXTable не работает с JXTable.При использовании режима Button Action это нормально, но при использовании F2 или двойного щелчка что-то в JXTable конфликтует с RXTable и удаляет выделение, поэтому у меня остается поведение по умолчанию.Это из-за GenericEditor, который он использует внутри или это что-то еще?
Как я могу заставить JXTable выбрать все в F2 или дважды щелкнуть по редактированию?
РЕДАКТИРОВАТЬ: похоже, это происходит только тогда, когда модель имеет столбец, определенный для типа Integer.Он работает, как и ожидалось, когда он определен для столбца String или Object.
Решение
Благодаря исправлению kleopatra мне удалось изменить метод selectAll, чтобы он обрабатывал JFormattedTextFields и все случаи редактирования.Поскольку исходный код работал над типом для редактирования, я просто использовал это исправление для других случаев.Вот чем я закончил.
Заменить 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();
}
});
}