View Full Version : [JAVA] JTable e MouseListener
guinnerd
01-08-2007, 12:13
Un saluto a tutti! Devo creare una JTable con 4 colonne che inizialmente non sono editabili. "L'editabilità" deve avvenire in modo sequenziale, da destra verso sinistra. Mi spiego: le celle più a sinistra inizialmente non sono editabili ma lo è soltanto quella più a destra. Quest'ultima inizialmente è vuota ma può contenere un numero con la virgola. Una volta che l'utente inserisce il numero e preme invio, la cella successiva (la seconda da destra) deve diventare editabile e via dicendo. Il criterio affinchè una cella diventi editabile è che la cella precedente contenga un numero con la virgola e che l'utente abbia premuto invio. Se l'utente non preme invio oppure inserisce un carattere e preme invio, la prossima cella non deve diventare editabile. Consigli su come realizzare questa funzionalità?
Prova a creare una sottoclasse di JTable e a sovrascrivere il metodo:
changeSelection(int, int, boolean, boolean)
L'invocazione condizionata della super-definizione dovrebbe permetterti di controllare il trasferimento della selezione da una cella all'altra (nel caso specifico, di impedire che il passaggio avvenga).
guinnerd
01-08-2007, 12:47
Puoi farmi un esempio pratico anche rozzo?
P.s. il titolo del 3d non c'entra granchè :p
Pardon, ho letto selezione invece era modifica.
Il metodo da ridefinire è isCellEditable. Ad esempio:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() { public void run() {
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
SubTable table = new SubTable();
table.setModel(new DefaultTableModel(4, 4));
JScrollPane scroller = new JScrollPane(table);
window.add(scroller);
window.pack();
window.setVisible(true);
}});
}
}
class SubTable extends JTable {
/* Sovrascrive il metodo isCellEditable della tabella */
public boolean isCellEditable(int row, int col) {
int maxCol = getColumnCount() - 1;
if(col == maxCol) {
//prima colonna a sinistra
return true;
} else {
//la cella precedente (sulla stessa riga) contiene un valore?
Object value = getValueAt(row, col + 1);
return !(value == null || String.valueOf(value).length() == 0);
}
}
}
L'altro metodo, changeSelection, lo ridefinisci se vuoi controllare lo spostamento della selezione (es. consentire la selezione solo delle celle che contengono un valore o che sono adiacenti a celle contenenti un valore).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.