PDA

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à?

PGI-Bis
01-08-2007, 12:40
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

PGI-Bis
01-08-2007, 14:28
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).