Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Jtable con celle di diversi componenti

    Salve a tutti. Vorrei realizzare una jtable a due colonne, in cui la prima colonna rappresenta un nome di un parametro mentra la seconda deve contenere il valore del parametro. Questa tabella si dovrebbe popolare importando un file di configurazione che contiene i vari nomi dei parametri e il suo tipo.
    Il mio problema e' questo, siccome vorrei una tabella piu' carina, volevo che in base al tipo del valore del parametro da inserire si modificasse la cella della jtabele. Cioe' se per caso si ha una data come cella compare una combobox in cui selezionare la data, stessa cosa per un booleano ecc..! spero di aver spiegato quello che voglio realizzare!!
    Prima di tutto cio' e' possibile?? e se si puo' fare, qualcuno mi potrebbe dare una dritta su come realizzarlo?? grazie!

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

    Re: Jtable con celle di diversi componenti

    Originariamente inviato da rocklife
    Il mio problema e' questo, siccome vorrei una tabella piu' carina, volevo che in base al tipo del valore del parametro da inserire si modificasse la cella della jtabele. Cioe' se per caso si ha una data come cella compare una combobox in cui selezionare la data, stessa cosa per un booleano ecc..! spero di aver spiegato quello che voglio realizzare!!
    Prima di tutto cio' e' possibile??
    Sì, si può fare.

    Originariamente inviato da rocklife
    e se si puo' fare, qualcuno mi potrebbe dare una dritta su come realizzarlo?? grazie!
    Innanzitutto documentati sugli "editor" e "renderer" gestiti da JTable:

    Concepts: Editors and Renderers

    Preparati però a documentarti e a "sperimentare" molto ... non è così banale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ok inizio a vedere queste cose!! ma per una singola colonna si possono definire piu' tipi con diversi valori per i combo box oppure e'fisso per una colonna???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rocklife
    ok inizio a vedere queste cose!! ma per una singola colonna si possono definire piu' tipi con diversi valori per i combo box oppure e'fisso per una colonna???
    La questione è questa: il table model ha e fornisce all'esterno la nozione del tipo della colonna (il metodo getColumnClass()) e in JTable esiste una "mappatura" che mappa il tipo ad un renderer e editor. Quindi generalmente usando i renderer/editor predefiniti si ha che una intera colonna è visualizzata/editata in un modo unico.
    Ma nulla vieta di definire un renderer che ritorna un componente specifico e diverso da visualizzare in base alla riga o al contenuto della cella e idem per l'editor.
    È solo meno banale da realizzare ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    per caso, e ti dico per caso!!! !! non e' che hai un esempio semplice sotto mano??? grazie!!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rocklife
    per caso, e ti dico per caso!!! !! non e' che hai un esempio semplice sotto mano??? grazie!!!
    Ne ho scritto uno, anche se molto incompleto ma giusto solo per darti una idea.

    codice:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class TestFrame extends JFrame {
        private JTable table;
        private JTextField textField1;
        private JTextField textField2;
        private JTextField textField3;
    
        public TestFrame() {
            super("Test Frame");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 200);
    
            Object[][] dati = { { "paperino" }, { Boolean.TRUE }, { new Integer(123) } };
            Object[] colonne = { "Dati" };
    
            table = new JTable(dati, colonne);
            JScrollPane scrollPane = new JScrollPane(table);
    
            MyCellRenderer myRenderer = new MyCellRenderer();
    
            table.setDefaultRenderer(Object.class, myRenderer);
    
            getContentPane().add(scrollPane, BorderLayout.CENTER);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TestFrame f = new TestFrame();
                    f.setVisible(true);
                }
            });
        }
    }
    
    
    class MyCellRenderer implements TableCellRenderer {
        private JCheckBox booleanCheckBox;
        private JComboBox stringsComboBox;
        private JLabel numberLabel;
    
        public MyCellRenderer() {
            booleanCheckBox = new JCheckBox();
            stringsComboBox = new JComboBox(new String[] { "topolino", "paperino" });
            numberLabel = new JLabel("", SwingConstants.RIGHT);
        }
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Boolean) {
                boolean b = ((Boolean) value).booleanValue();
                booleanCheckBox.setSelected(b);
                return booleanCheckBox;
            } else if (value instanceof String) {
                stringsComboBox.setSelectedItem(value);
                return stringsComboBox;
            } else if (value instanceof Integer) {
                int v = ((Integer) value).intValue();
                numberLabel.setText(String.valueOf(v));
                return numberLabel;
            } else {
                return null;   // non dovrebbe succedere
            }
        }
    }
    È una tabella con 1 sola colonna e 3 dati di tipo diverso in colonna. Ho definito un apposito renderer che ritorna un componente specifico in base al tipo di dato.

    Il renderer l'ho registrato con setDefaultRenderer specificando Object.class perché è il tipo che il table model di default ritorna (non ho definito un table model, passo i dati direttamente a JTable).

    È molto incompleto come esempio perché:

    a) Non ho definito un "editor", rimane l'editor di default che gestisce solo l'input di una stringa (e se provi ad editare una cella succede che .... diventa di tipo String!).

    b) Non ho gestito lo stato di selezione/focus. Quando getTableCellRendererComponent viene invocato, si dovrebbe impostare il componente in modo che mostri visivamente lo stato di selezione/focus. Creando e gestendo così 3 componenti a "mano" e da zero, non l'ho fatto (ci voleva codice in più).

    c) Ci sono questioni di performance per cui il componente che il renderer ritorna non dovrebbe fare certe cose perché inutili per come è gestito il rendering della cella (si veda la documentazione e il sorgente di DefaultTableCellRenderer).

    d) L'altezza delle righe nella tabella, non dipende dal componente ritornato dal renderer ma è impostato da JTable (si veda setRowHeight()).

    Insomma, come vedi, si può fare ma non è così banale ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    non pensavo fosse cosi tosto!!! sarei tentato di mollare!! ma non mi puo' battere!!!! il problema e che non ho ancora trovato una guida decedete su tale argomento! quella della sun per me non e' fatta benissimo!!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rocklife
    non pensavo fosse cosi tosto!!! sarei tentato di mollare!! ma non mi puo' battere!!!! il problema e che non ho ancora trovato una guida decedete su tale argomento! quella della sun per me non e' fatta benissimo!!
    C'è il capitolo 6 "Creating Custom Table Renderers" (70 pagine) gratuito in PDF del libro "Core Swing: Advanced Programming". Il libro è parecchio vecchio ma ciò che spiega per i renderer è ancora sicuramente "attuale".

    Puoi spulciare altra documentazione sull'argomento facendo magari qualche ricerca su Google Libri. Puoi vedere esempi e articoli ad esempio qui, qui o qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Riesumo questo post perché sto impazzendo!
    premetto che ho già letto tutta la documentazione,girato in internet per giorni, letto i capitoli di libri che ne parlano ma non sono riuscito ancora a capire come diamine scrivere una classe per il render di diversi componenti!
    io ho una tabella dove la prima colonna è composta da JComboBox, la seconda da JLabel, la terza da JCheckBox e così via....
    ora la mia tabella (senza renderer particolari) visualizza i dati (solo dopo il click del mouse sulla cella) in modo non appropriato: le checkbox con true e false, le combobox non si vedono se non si clicca sopra ecc...
    qualcuno potrebbe darmi uno spunto per creare una classe "MultiRenderer" che mi permetta di fare il render di almeno le combo le check e le textField?
    Anche con codice generico....
    Vi ringrazio in anticipo per le risposte anche perché se no non saprei più dove guardare...

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.