Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Celle JTable

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347

    Celle JTable

    Buongiorno a tutti,
    vi descrivo il mio problema:
    ho una jtable con celle editabili.
    Avrei la necessità di non fare scrivere più di tot carattere nelle celle.

    Io pensavo di mettere alle celle un JTextField (non so come) e lavorare sul suo PlainDocument (pensavo con espressioni booleane).
    Avete un altro modo (più semplice) per farlo?
    Thanx
    nh

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Celle JTable

    Originariamente inviato da newhook
    ho una jtable con celle editabili.
    Avrei la necessità di non fare scrivere più di tot carattere nelle celle.

    Io pensavo di mettere alle celle un JTextField (non so come) e lavorare sul suo PlainDocument (pensavo con espressioni booleane).
    La gestione delle celle in un JTable si basa sui "renderer" e sugli "editor".
    Per definire un editor si deve fare una classe che implementa TableCellEditor ma in realtà nel tuo caso specifico invece di implementare un editor da zero, c'è una strada più semplice: usare javax.swing.DefaultCellEditor.
    DefaultCellEditor ha diversi costruttori e uno di questi riceve un JTextField ... che sarà il componente di editor. Quindi, detto come singoli passi dovresti:

    1) Implementare un "tuo" document che estende PlainDocument e gestire qui dentro la limitazione (nota: trovi esempi tra i miei Java Examples, vedi firma).

    2) Istanziare un JTextField e assegnargli il tuo document.

    3) Istanziaure un DefaultCellEditor passando il text field.

    4) Associare il DefaultCellEditor o a una colonna specifica della tabella oppure, più in generale, ad un "tipo" (Class) usando setDefaultEditor(Class<?> columnClass, TableCellEditor editor)


    P.S. questo è un ottimo spunto per realizzare un esempio che metterò tra i miei Java Examples.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    mmm... ti faccio vedere cosa sto facendo
    codice:
    public class CellaEditabile extends DefaultCellEditor{
    
    	public CellaEditabile(JTextField textField) {
    		super(textField);
    		DocumenControl documenControl=new DocumenControl("\\d{0,4}", textField);
    		textField.setDocument(documenControl);
    	}
    
    
    }
    poi nella classe dove sto definendo la tabella (nel prepareRenderer)
    [code]
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {


    Component c = super.prepareRenderer(renderer, row, column);


    DefaultCellEditor ce=new CellaEditabile(new JTextField());
    [/ code]
    credo che ho "coperto" i tuoi du punti. non mi è chiaro new CellaEditabile(new JTextFiel());
    Thanx

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    codice:
    public class CellaEditabile extends DefaultCellEditor{
    Non è per forza di cose necessario estendere DefaultCellEditor. Se vuoi farlo per "incapsulare" magari la creazione del JTextField e del tuo document .... beh, ok!
    Infatti ... perché dovresti passare un JTextField!! A questo punto, "incapsula" tutto ... no?

    Nota: non so come hai gestito DocumenControl ma se usi una espressione regolare pensando di controllare l'intero contenuto devi stare molto attento!! Perché nel insertString() ti viene passata solo la parte da aggiungere .... e se la aggiunta arriva dalla tastiera solo 1 carattere per volta!

    Originariamente inviato da newhook
    codice:
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    A dire il vero non sarebbe nemmeno necessario estendere JTable e fare l'override di prepareRenderer. Primo perché come hai fatto istanzi il tuo CellaEditabile tante volte, ogni volta che un renderer viene "preparato" e poi comunque ha poco senso che lo fai in relazione ad un renderer!!

    L'ho detto prima: puoi associare l'editor ad una colonna specifica (prendi il TableColumnModel e poi il TableColumn per la colonna x e setti l'editor) oppure associ l'editor ad un Class (Object.class va bene se usi uno dei model di default) in modo che valga per tutte le celle di quel tipo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    sono arrivato a questa situazione:

    DefaultCellEditor dce= new DefaultCellEditor(jtf);

    dove jtf è la mia JTextField con document settato con espressione regolare. tutto ok!
    ho un solo problema...me lo fa per utte le celle.
    ho seguito il tuo consiglio di prima e ho fatto:

    codice:
    TableColumnModel tcm=table.getColumnModel();
    			TableColumn tc=tcm.getColumn(0);
    			tc.setCellEditor(dce);
    ma non va...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    dove jtf è la mia JTextField con document settato con espressione regolare. tutto ok!
    Tutto ok no ... non hai detto come usi la espressione regolare .... e se hai capito cosa dicevo prima a riguardo.

    Originariamente inviato da newhook
    codice:
    TableColumnModel tcm=table.getColumnModel();
    			TableColumn tc=tcm.getColumn(0);
    			tc.setCellEditor(dce);
    ma non va...
    Tecnicamente è perfettamente corretto e valido. In che senso "non va"??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    posto DocumenControl già è stata una nostra discussione...

    codice:
    public class DocumenControl  extends PlainDocument {
    	private final String expRegular;
    	private final JTextField jtf;
    	
    	public DocumenControl(String exp, JTextField jtf) {
    		expRegular = exp;
    		this.jtf=jtf;
        }
    	
    	
    	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            String tmp="";
            tmp=jtf.getText()+str;
            
            
            if(str!=null && tmp.matches(expRegular))
            	super.insertString(offs, str, a);
        }
    
    
    	public JTextField getJtf() {
    		return jtf;
    	}
    
    
    }
    tcm non va nel senso che la regola dell'espressione mi vale per tutte le celle...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    per completezza allora ho fatto in questo modo:

    codice:
    dc = new DocumenControl("\\d{0,4}",new JTextField());
    			JTextField jtf= dc.getJtf();
    			jtf.setDocument(dc);
    			dce= new DefaultCellEditor(jtf);
    			
    			table.setDefaultEditor(Object.class, dce);
    
    			table.setModel(ctm);			
    			
    			TableColumnModel tcm=table.getColumnModel();
    			TableColumn tc=tcm.getColumn(0);
    			tc.setCellEditor(dce);
    			table.setColumnModel(tcm);
    magari può chiarire il mio kaos

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    posto DocumenControl già è stata una nostra discussione...
    Sì ma allora non hai proprio capito la questione concettuale di fondo ....
    insertString() ti fornisce solo aggiunte "incrementali" e questo mal si addice ad un match "completo" con una espressione regolare.

    Già di per sé la tua implementazione è sbagliata, anche per un altro motivo. La stringa passata ad insertString() la appendi sempre dietro al testo già presente. NO. Lo vedi quel parametro int offs??? Indica il punto nel document in cui la stringa va inserita. E non necessariamente è al fondo. Metti che tu vai con il cursore in mezzo al testo ... la stringa (se digiti caratteri è solo 1 char per volta) va aggiunta lì in mezzo, non certo al fondo!!

    E poi comunque torniamo sulla questione della regex. Tu imponi una regex che deve controllare il contenuto nella sua "interezza". Ammettiamo che tu riesca a comporre una stringa temporanea che è come "dovrebbe" essere gestendo cioè correttamente l'offset.
    Ma gli insertString() ti danno solo aggiunte "parziali".

    Pensa ad una regex "[a-z]{2}\\d". Ovvero lettera, lettera, digit. Se il campo di testo e vuoto e tu digiti una lettera, insertString() viene invocato per ricevere questa singola lettera. Ora "x" non corrisponde certo alla regex!!!
    Hai capito?? Essendo tutto "incrementale" puoi trovarti, a seconda della regex, in situazioni non valide ma che invece solo in "futuro" potranno essere valide contando sulla interezza del contenuto.

    Originariamente inviato da newhook
    codice:
    table.setDefaultEditor(Object.class, dce);
    Ma ovvio!! Così l'hai associato a Object.class che generalmente (per i model di default) vale per tutte le celle!!
    Se anche dopo assegni l'editor ad una colonna .... l'hai già registrato prima in modo più globale!!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    codice:
    TableColumnModel tcm=table.getColumnModel();
    		TableColumn tc0=tcm.getColumn(0);
    		tc0.setCellEditor(new CellaEditabile(new JTextField(), "\\w{0,4}"));
    ora va...lo inserivo quando ancora il mio modello era vuoto .

    per la questione dell'espressione regolare la leggo con più calma domani e ti farò sapere...

    grazie 1000 per l'aiuto

    nh

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.