PDA

View Full Version : [JAVA] JTable e format del testo in ingresso


grifis78
12-02-2010, 12:39
Ciao ragazzi,

le ho davvero provate tutte, ma non capisco proprio come fare a validare l'input dell'utente su una cella di JTable. Sulla documentazione ufficiale (http://java.sun.com/docs/books/tuto...ents/table.html) c'è un esempio, ma si utilizza un array bidimensionale per caricare i dati che verrano visualizzati in seguito. Io invece utilizzo semplicemente un AbstractTableModel.

In particolare, vorrei che in una colonna vengano inseriti soltanto dati numerici nell'intervallo 0-100, mentre in un'altra dati double con solo due cifre decimali.

Ho trovato in rete questo codice:


JTable table = new JTable();

// Add some data...

int vColIndex = 0;
TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyTableCellEditor());

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
// This is the component that will handle the editing of the cell value
JComponent component = new JTextField();
// This method is called when a cell value is edited by the user.
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at (rowIndex, vColIndex)
if (isSelected) { // cell (and perhaps other cells) are selected

}
// Configure the component with the specified value
((JTextField)component).setText((String)value);
// Return the configured component return component;
return component;
}

// This method is called when editing is completed.
// It must return the new value to be stored in the cell.
public Object getCellEditorValue() {
return ((JTextField)component).getText();
}
}

Ad esempio, se volessi validare un numero in ingresso che non debba contenere più di 3 cifre?

Grazie fin d'ora...

PGI-Bis
12-02-2010, 15:27
I metodi che ti interessano sono stopCellEditing e cancelCellEditing di TableCellEditor.

La faccenda è in verità piuttosto semplice. Faccio una sintesi.

Quando l'editor entra in scena prendi il "value" di getTableCellEditorComponent, lo mostri nel componente per le modifiche e allo stesso tempo lo metti da parte.

Quando l'utente ha finito di modificare la cella viene invocato il metodo stopCellEditing.

Se il contenuto del componente usato dell'editor è valido, in stopCellEditing:

1. fai in modo che il valore restituito dal metodo getCellEditorValue corrisponda al contenuto del componente usato dall'editor
2. spari un "editing stopped"
3. restituisci true

altrimenti restituisce false.

Se la tabella rileva un evento - di solito la perdita del focus - che impone un'interruzione incondizionata delle modifiche, è invocato il metodo cancelCellEditing e qui:

1. fai in modo che il valore restituito dal metodo getCellEditorValue corrisponda al valore che la cella aveva prima delle modifiche
2. spari un "editing canceled"

Ed è fatta. Se per le modifiche usi un JTextField puoi applicare in tutto o in parte le temibili espressioni regolari.

L'editor che segue accetta al massimo 3 cifre.

class DoubleCellEditor extends AbstractCellEditor implements TableCellEditor {
private Object originalValue, editorValue;
private JTextField editorComponent = new JTextField();

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
originalValue = editorValue = value;
editorComponent.setText(originalValue == null ? "" : String.valueOf(originalValue));
return editorComponent;
}

public Object getCellEditorValue() {
return editorValue;
}

public boolean stopCellEditing() {
if(checkEditedValue()) {
editorValue = editorComponent.getText();
fireEditingStopped();
return true;
} else {
return false;
}
}

public void cancelCellEditing() {
editorValue = originalValue;
fireEditingCanceled();
}

private boolean checkEditedValue() {
String value = editorComponent.getText();
boolean answer = value.length() <= 3;
for(int i = 0; answer && i < value.length(); i++) {
int codePoint = Character.codePointAt(value, i);
answer = Character.isDigit(codePoint);
}
return answer;
}
}

grifis78
13-02-2010, 09:50
PGI, grazie! Come al solito sei un grande.... Adesso vedrò di costruirne uno che mi permetta di visualizzare un double con la seconda cifra decimale, in quanto se in una cella inserisco, ad esempio, 15, il valore che verrà visualizzato sarà soltanto 15.0, mentre io vorrei far comparire 15.00! Beh, sono certo che verrò a chiedere di nuovo aiuto... Grazie ancora!