Come rendere un JTable
non modificabile? Non voglio che i miei utenti possano modificare i valori nelle celle facendo doppio clic su di essi.
Come rendere un JTable
non modificabile? Non voglio che i miei utenti possano modificare i valori nelle celle facendo doppio clic su di essi.
Risposte:
Puoi usare un file TableModel
.
Definisci una classe come questa:
public class MyModel extends AbstractTableModel{
//not necessary
}
in realtà isCellEditable()
è false
di default, quindi puoi ometterlo. (vedi: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )
Quindi usa il setModel()
metodo del tuo JTable
.
JTable myTable = new JTable();
myTable.setModel(new MyModel());
public void
metodo restituisca un valore booleano.
isCellEditable
Puoi sovrascrivere il metodo isCellEditable e implementarlo come desideri, ad esempio:
//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table.setModel(tableModel);
o
//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//Only the third column
return column == 3;
}
};
table.setModel(tableModel);
Nota per se il tuo JTable scompare
Se JTable
stai scomparendo quando lo usi, è molto probabile perché devi usare DefaultTableModel(Object[][] data, Object[] columnNames)
invece il costruttore.
//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table.setModel(tableModel);
table.setDefaultEditor(Object.class, null);
basta aggiungere
table.setEnabled(false);
per me funziona bene.
Se stai creando il TableModel automaticamente da un insieme di valori (con "new JTable (Vector, Vector)"), forse è più facile rimuovere gli editor dalle colonne:
JTable table = new JTable(my_rows, my_header);
for (int c = 0; c < table.getColumnCount(); c++)
{
Class<?> col_class = table.getColumnClass(c);
table.setDefaultEditor(col_class, null); // remove editor
}
Senza editor, i dati non saranno modificabili.
new JTable(Vector, Vector)
e ho lavorato per me. Non ho bisogno di un editor in nessuna cella, quindi hai il mio voto.
L'ho usato e ha funzionato: è molto semplice e funziona bene.
JTable myTable = new JTable();
myTable.setEnabled(false);
creare una nuova classe DefaultCellEditor:
public static class Editor_name extends DefaultCellEditor {
public Editor_name(JCheckBox checkBox) {
super(checkBox);
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
}
}
e usa setCellEditor:
JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));