Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218

    Problema con JCheckBox in JTable

    Il checkbox viene creato e visualizzato correttamente, ed è editabile.
    Il problema è che durante il click si sposta verso sinistra per poi tornare allineato al centro quando si rilascia.

    codice:
    Object[][] dati = {{new Boolean(false), new String(), new Integer(0)}};
    Object[] columnNames = {
    				"",
    				"Proprietario", 
    				"Quota" };
    			
    datiUIModel = new DefaultTableModel(dati, columnNames);
    tbl_datiUI = new JTable(datiUIModel);
    
    tbl_datiUI.getColumnModel().getColumn(0).setCellRenderer(tbl_datiUI.getDefaultRenderer(Boolean.class));
    			tbl_datiUI.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));
    			tbl_datiUI.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer(comboBoxItems));    
    			tbl_datiUI.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor( new JComboBox(comboBoxItems)));
    			tbl_datiUI.getColumnModel().getColumn(1).setPreferredWidth(195);
    			tbl_datiUI.getColumnModel().getColumn(2).setPreferredWidth(20);
    A cosa può essere dovuto???

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

    Re: Problema con JCheckBox in JTable

    Originariamente inviato da TheBestNeo
    A cosa può essere dovuto???
    A questo: per la colonna 0 hai impostato un editor con:

    tbl_datiUI.getColumnModel().getColumn(0).setCellEd itor(new DefaultCellEditor(new JCheckBox()));

    che però non è esattamente lo stesso identico tipo di editor che verrebbe fuori di "default" per la classe Boolean.class.

    Metti:

    tbl_datiUI.getColumnModel().getColumn(0).setCellEd itor(tbl_datiUI.getDefaultEditor(Boolean.class));

    e vedrai che funziona senza difetti visivi.


    Nota che un checkbox viene mostrato/gestito di default se il getColumnClass() del model ritorna Boolean.class. DefaultTableModel è "generico" e ritorna sempre Object.class. Se hai tempo/voglia cerca di vedere come realizzare un "tuo" table model che estende AbstractTableModel (però è più complesso). In alternativa puoi estendere DefaultTableModel e fare l'override di getColumnClass().
    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
    Apr 2007
    Messaggi
    218
    Grazie era proprio quello.
    Per ora provo ad usare ancora il default, nel caso mi si presentino troppi problemi lo creerò!

    Il problema era che estendendo non sapevo dove mettere i dati.
    O meglio, i metodi definiti dal defaultTableModel andranno a cercarli in un determinato campo.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da TheBestNeo
    Il problema era che estendendo non sapevo dove mettere i dati.
    O meglio, i metodi definiti dal defaultTableModel andranno a cercarli in un determinato campo.
    Se estendi AbstractTableModel la struttura dati è completamente da gestire, a tuo carico. Se hai una classe es. Riga che "modella" i dati di una riga puoi gestirlo come array Riga[] o collezione ArrayList<Riga> o altrimenti come Object[][] o ArrayList di ArrayList.
    Insomma ... quello che vuoi.

    Se estendi DefaultTableModel la struttura è già gestita come Vector di Vector di Object. Potresti anche solo fare l'override di getColumnClass():

    codice:
    class MyTableModel extends DefaultTableModel {
        public Class<?> getColumnClass(int columnIndex) {
            switch (columnIndex) {
                case 0: return Boolean.class;
                case 1: return String.class;
                case 2: return Integer.class;
            }
            
            return Object.class;
        }
    }
    e a quel punto:

    datiUIModel = new MyTableModel(dati, columnNames);

    La prima colonna avrebbe i checkbox e la terza numeri allineati a destra.
    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
    Apr 2007
    Messaggi
    218
    Grazie della spiegazione!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Altro problema.
    Se aggiungo righe alla mia tabella i combobox vanno in palla,, selezionando una voce da uno a volte cambiano anche gli altri senza senso.

    Utilizzando sia il defaultTableCellrenderer che il mio:

    codice:
    public class ComboBoxRenderer extends JComboBox implements TableCellRenderer{
    
    		public ComboBoxRenderer(String[] items)  {
    			super(items);
    		}
    		
    		public Component getTableCellRendererComponent(JTable table, Object value, 
    				boolean isSelected, boolean hasFocus, int row, int col) {
    			setSelectedItem(value);
    			return this;
    		}
    		
    }
    Lo chiamo cosi:

    codice:
     tbl_datiUI.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer(comboBoxItems));

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Piccolo up! :quote:

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da TheBestNeo
    Se aggiungo righe alla mia tabella i combobox vanno in palla,, selezionando una voce da uno a volte cambiano anche gli altri senza senso.
    Ovviamente non dovrebbe certo farlo ... e se te lo fa c'è sicuramente qualcosa che non va ..... e che non si può capire dal codice postato (che mi sembra peraltro corretto).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Ok quindi non è una cosa che dipende da me...
    Opterò per la soluzione senza renderer, come per altro fanno sui tutorial JAVA.
    Grazie

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da TheBestNeo
    Ok quindi non è una cosa che dipende da me...
    E chi l'ha detto??? ... non vedo il resto del codice ... quindi potrebbe essere un errore in un'altra parte del tuo programma.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.