Поведение JTable по умолчанию заключается в добавлении к содержимому, когда вы начинаете печатать, и размещении каретки в выбранном месте при нажатии.Я хочу, чтобы поведение обеих этих вещей изменилось, поэтому при редактировании ячейки содержимое заменяется либо путем ввода, либо путем нажатия, а затем ввода.Однако, когда я щелкаю ячейку и затем изменяю позицию каретки, я хочу, чтобы содержимое оставалось, чтобы я мог ее изменить.
Я знаю, как выбрать все, когда ячейка становится редактируемой, заменив редактор ячейки натот, который выбирает все внутри SwingUtilities.invokeLater (см. в другом месте ), но это приводит к нарушению поведения при печати.Когда я делаю это и начинаю печатать в ячейке, сначала к строке добавляется набранный символ, затем он выбирается (но выбор невидим!), А при вводе другого символа содержимое заменяется этим.
Есть ли способ заменить содержимое сразу при вводе в выделенную (но не редактируемую) ячейку, но выбрать все при щелчке по ячейке?
Вот код, который я использую для CellEditor:
public class TextFieldCellEditor extends JTextField implements TableCellEditor
{
private CellEditorListener cellEditorListener = null;
private boolean isInteger = false;
private Object oldValue;
// Start editing
@Override
public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int column)
{
Color color2 = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
super.setBackground(color2 != null && (row & 1) == 1? color2 : table.getBackground());
super.setForeground(table.getForeground());
super.setBorder(DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder"));
super.setText(obj.toString());
isInteger = obj instanceof Integer;
if (isInteger)
{
super.setHorizontalAlignment(SwingConstants.RIGHT);
oldValue = obj;
}
// SwingUtilities.invokeLater(new Runnable()
// {
// public void run()
// {
// TextFieldCellEditor.this.selectAll();
// }
// });
return this;
}
// Retrieve e dited value
@Override
public Object getCellEditorValue()
{
if (isInteger)
{
// Try to convert to integer. If input is invalid, revert.
try
{
return new Integer(super.getText());
}
catch (NumberFormatException e)
{
return oldValue;
}
}
return super.getText();
}
@Override
public boolean isCellEditable(EventObject e)
{
return true;
}
@Override
public boolean shouldSelectCell(EventObject e)
{
return true;
}
@Override
public boolean stopCellEditing()
{
cellEditorListener.editingStopped(new ChangeEvent(this));
return true;
}
@Override
public void cancelCellEditing()
{
cellEditorListener.editingCanceled(new ChangeEvent(this));
}
@Override
public void addCellEditorListener(CellEditorListener celleditorlistener)
{
cellEditorListener = celleditorlistener;
}
@Override
public void removeCellEditorListener(CellEditorListener celleditorlistener)
{
if (cellEditorListener == cellEditorListener) cellEditorListener = null;
}
}