Il comportamento predefinito di una tabella può essere aggiunto al contenuto quando si inizia a digitare e per posizionare il punto di inserimento nella posizione cliccata quando si fa clic. Voglio che il comportamento di entrambe queste cose cambi, quindi il contenuto viene sostituito quando modifico una cella, digitando o facendo clic e quindi digitando. Quando faccio clic su una cella e poi cambio la posizione del cursore, tuttavia, voglio che il contenuto rimanga così posso cambiarlo.Come selezionare tutto il testo nella cella JTable durante la modifica ma non durante la digitazione?
So come selezionare tutto quando la cella diventa in fase di modifica, sostituendo l'editor di celle con uno che seleziona tutto all'interno di SwingUtilities.invokeLater (vedere elsewhere), ma questo causa la rottura del comportamento di battitura. Quando faccio questo e inizio a digitare in una cella, prima il carattere digitato viene aggiunto alla stringa, quindi viene selezionato (ma la selezione è invisibile!) E quando si digita un altro carattere il contenuto viene sostituito da quello.
C'è un modo per sostituire il contenuto immediatamente quando si digita una cella evidenziata (ma non in modifica), ma si seleziona tutto quando si fa clic su una cella?
ecco il codice che uso per il 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;
}
}
questa implementazione non è valida: a) non supporta l'aggiunta di più di un listener b) non notifica l'ascoltatore quando viene arrestato/annullato per motivi _internal_ (come fi premendo enter) Vedi l'origine di DefaultCellEditor per avere un'idea di cosa è necessario – kleopatra
Than ks. Aggiustato. –