Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [JAVA] Finestra con menu multiplo a cascata

    Buongiorno,

    devo effettuare questo:

    a seconda del valore di un campo, deve comparire una finestra con 3 menu a cascata. Non so se questo è il termine giusto, ma per menu a cascata intendo un rettangolo vuoto che, se cliccato, dà accesso a delle scelte, come il menu del browser.

    da così


    ____________
    |___________|



    dovrebbe diventare così:
    ____________________
    |-------campo1----------|
    |-------campo2----------|
    |-------campo3----------|
    |-------campo4----------|
    |-------campo5----------|

    Scusate per il disegno un po' schifoso...

    A seconda del campo scelto nel primo menu, il secondo, una volta cliccato, dovrebbe far apparire alcuni campi determinati dalla prima scelta: lo stesso dicasi per il terzo menu.

    Inoltre, non si dovrebbe poter scegliere alcuna opzione dal secondo o terzo menu prima di aver settato il primo.

    Una volta settati i campi, la finestra si dovrebbe chiudere se l'utente volesse, altrimenti dovrebbe rimanere aperta.


    Qualcuno sa aiutarmi???.

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

    Re: [JAVA] Finestra con menu multiplo a cascata

    Originariamente inviato da ragnonerodocet
    a seconda del valore di un campo, deve comparire una finestra con 3 menu a cascata. Non so se questo è il termine giusto, ma per menu a cascata intendo un rettangolo vuoto che, se cliccato, dà accesso a delle scelte, come il menu del browser.
    Innanzitutto un minimo di terminologia ci vuole ..... non è che si può dire "rettangolo vuoto" ... "scelte", ecc....

    I componenti AWT, e meglio Swing, sono ben definiti e documentati. Una panoramica dei componenti Swing è qui.

    Da quello che dici potrei pensare che ti vadano bene 3 JComboBox.

    Originariamente inviato da ragnonerodocet
    A seconda del campo scelto nel primo menu, il secondo, una volta cliccato, dovrebbe far apparire alcuni campi determinati dalla prima scelta: lo stesso dicasi per il terzo menu.

    Inoltre, non si dovrebbe poter scegliere alcuna opzione dal secondo o terzo menu prima di aver settato il primo.

    Una volta settati i campi, la finestra si dovrebbe chiudere se l'utente volesse, altrimenti dovrebbe rimanere aperta.
    Si può fare tutto questo ... indubbiamente.
    Inizia innanzitutto a delineare meglio quali componenti vuoi usare (JComboBox? e magari anche altro es. JLabel per delle diciture?), come vuoi disporli nella finestra e a quel punto si può certamente studiare cosa fare.

    Dato un JComboBox ad esempio è facile ricevere notifica del cambiamento di selezione e a quel punto si può fare altro es. visualizzare/nascondere altri componenti, impostare altri componenti, ecc...

    Devi prima chiarire quali componenti vuoi usare e come vuoi disporli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ora che ho più chiara la situazione, vorrei utilizzare questi componenti.

    3 JComboBox, una sotto l'altra, in alto a sinistra.
    Al di sotto di queste 2 label affiancate per eventuali diciture.

    Sono riuscito a creare una JComboBox e un label.

    Resta l'arcano di come far si che la selezione della prima JComboBox influenzi la seconda e la terza.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ragnonerodocet
    Resta l'arcano di come far si che la selezione della prima JComboBox influenzi la seconda e la terza.
    Per avere notifica della selezione in un JComboBox, si possono usare 2 tipi di listener: ActionListener e ItemListener. Ci sono delle differenze, ovviamente, sia a livello concettuale che di utilizzo tra i due.
    Se ti basta sapere che "qualcosa" è stato selezionato, usa ActionListener. Però non ti fornisce direttamente la informazione di cosa è stato selezionato, devi prendere la informazione dal JComboBox (getSelectedIndex() o getSelectedItem()). A quel punto, in base alla selezione fai qualunque altra cosa che vuoi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Dopo innumerevoli prove, ho utilizzato le jComboBox...

    Continuo ad avere problemi causa l'ignoranza ActionListener

    Mettiamo il caso più semplice:

    nella prima JCB posso scegliere tra item 1 e item 2

    Se scelgo item 1 allora nella seconda JCB devo poter scegliere tra item A e item B, al contrario, scegliendo item 2 dovrei poter scegliere tra item C e item D.

    Il brutto è che effettuata la prima scelta (mettiamo item 1) mi appare nella seconda JCB già l'opzione item A (vorrei restasse vuoto). Comunque, anche se accettassi questo problemino, se poi nella seconda JCB vado a scegliere ietm B mi scompare ciò che avevo scelto nella prima!!!!!!!!!!!!!!!!

    Posto il codice...

    jComboBox1 = new javax.swing.JComboBox();
    this.jComboBox1.addActionListener(this);

    jComboBox2 = new javax.swing.JComboBox();
    this.jComboBox2.addActionListener(jComboBox1);


    public void actionPerformed(ActionEvent e) {
    if (this.jComboBox1.getSelectedIndex() == 0)
    jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 5", "Item 6", "Item 7", "Item 8" }));
    else if (this.jComboBox1.getSelectedIndex() == 1)
    jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 9", "Item a", "Item b", "Item c" }));


  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ragnonerodocet
    Il brutto è che effettuata la prima scelta (mettiamo item 1) mi appare nella seconda JCB già l'opzione item A (vorrei restasse vuoto).
    Metti un item vuoto "" e poi dopo il set del model, seleziona quello.

    Originariamente inviato da ragnonerodocet
    this.jComboBox2.addActionListener(jComboBox1);
    Questo NON ti serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ho capito la prima risposta e ho agito di conseguenza.

    Il bello però è che in realtà le JCB sono3, la prima influenza la seconda e la seconda influenza la terza...

    Avevo pensato a scrivere questo:

    jComboBox1 = new javax.swing.JComboBox();
    this.jComboBox1.addActionListener(this);

    jComboBox2 = new javax.swing.JComboBox();

    jComboBox3 = new javax.swing.JComboBox();

    jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

    public void actionPerformed(ActionEvent e) {
    if (this.jComboBox1.getSelectedIndex() == 0)
    jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 5", "Item 6", "Item 7", "Item 8" }));
    else if (this.jComboBox1.getSelectedIndex() == 1)
    jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 9", "Item a", "Item b", "Item c" }));

    if (this.jComboBox2.getSelectedIndex() == 0)
    jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item l", "Item m", "Item n", "Item o" }));
    else if (this.jComboBox2.getSelectedIndex() == 1)
    jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item p", "Item q", "Item r", "Item s" }));

    }
    Ma la terza finestra non è per nulla influenzata dalla scelta che faccio...

  8. #8
    Dato che la seconda JCB influenza la terza, non devo mettere un ActionListener anche sulla seconda?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Prova questo. Non è proprio "banale" ma nemmeno super-complicato. Ho semplicemente "incapsulato" la gestione del rapporto tra un JComboBox e il JComboBox "parente" da cui dipende.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import java.beans.*;
    import javax.swing.*;
    
    public class TestFrame extends JFrame {
        private JComboBox comboBox1;
        private JComboBox comboBox2;
        private JComboBox comboBox3;
    
        public TestFrame() {
            super("Test");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(600, 200);
            setLayout(new FlowLayout(FlowLayout.LEFT));
    
            ComboBoxModel processoriAmdModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli processore AMD--", null),
                new ComboItem("Athlon 62 X2 5000+", null),
                new ComboItem("Phenom X4 Quad 9550", null),
            });
    
            ComboBoxModel processoriIntelModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli processore Intel--", null),
                new ComboItem("Intel Core 2 Duo E8400", null),
                new ComboItem("Intel Core 2 Quad Q9550", null),
            });
    
            ComboBoxModel memorieCorsairModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli memoria Corsair--", null),
                new ComboItem("Corsair TWIN2X 4096-6400C5", null),
                new ComboItem("Corsair TWIN3X 2048-1333C9", null),
            });
    
            ComboBoxModel memorieKingstonModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli memoria Kingston--", null),
                new ComboItem("Kingston KVR1066D3N7/1G", null),
                new ComboItem("Kingston KHX8500D2K2/2G", null),
            });
    
            ComboBoxModel processoriModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli marca processore--", null),
                new ComboItem("AMD", processoriAmdModel),
                new ComboItem("Intel", processoriIntelModel),
            });
    
            ComboBoxModel memorieModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli marca memoria--", null),
                new ComboItem("Corsair", memorieCorsairModel),
                new ComboItem("Kingston", memorieKingstonModel),
            });
    
            ComboBoxModel mainModel = new DefaultComboBoxModel(new Object[] {
                new ComboItem("--scegli hardware--", null),
                new ComboItem("Processori", processoriModel),
                new ComboItem("Memorie", memorieModel),
            });
    
            comboBox1 = new JComboBox(mainModel);
            comboBox2 = new SubComboBox(comboBox1);
            comboBox3 = new SubComboBox(comboBox2);
    
            Container contentPane = getContentPane();
            contentPane.add(comboBox1);
            contentPane.add(comboBox2);
            contentPane.add(comboBox3);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    TestFrame f = new TestFrame();
                    f.setVisible(true);
                }
            });
        }
    }
    
    
    class ComboItem {
        private String text;
        private ComboBoxModel subModel;
    
        public ComboItem(String text, ComboBoxModel subModel) {
            this.text = text;
            this.subModel = subModel;
        }
    
        public String toString() {
            return text;
        }
    
        public ComboBoxModel getSubModel() {
            return subModel;
        }
    }
    
    
    class SubComboBox extends JComboBox {
        private JComboBox parentComboBox;
    
        public SubComboBox(JComboBox parentComboBox) {
            this.parentComboBox = parentComboBox;
    
            parentComboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    updateFromParent();
                }
            });
    
            parentComboBox.addPropertyChangeListener(new PropertyChangeListener() {
                public void propertyChange(PropertyChangeEvent e) {
                    if (e.getPropertyName().equals("model")) {
                        updateFromParent();
                    }
                }
            });
        }
    
        private void updateFromParent() {
            Object o = parentComboBox.getSelectedItem();
    
            ComboBoxModel model = null;
    
            if (o instanceof ComboItem) {
                ComboItem ci = (ComboItem) o;
                model = ci.getSubModel();
            }
    
            if (model == null) {
                model = new DefaultComboBoxModel();
            }
    
            setModel(model);
        }
    }
    Dal codice:

    comboBox1 = new JComboBox(mainModel);
    comboBox2 = new SubComboBox(comboBox1);
    comboBox3 = new SubComboBox(comboBox2);


    si nota bene come comboBox2 dipende da comboBox1 e comboBox3 dipende da comboBox2 (e, transitivamente, comboBox3 dipende da comboBox1)

    Quando la selezione oppure il model di un combo box "parente" cambia, il combo box dipendente riceve notifica tramite i due listener interni ed aggiorna il suo model grazie al fatto che ComboItem tiene anche la informazione sul model da fornire al combo dipendente.

    L'unica cosa noiosa è la creazione di tutta la catena dei model.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    A questo punto riprendo da qui.

    Ho provato vari metodi per settare la dimensione standard della mia JCB.

    Di default, ha una lunghezza x.

    Nel momento in cui effettuo una scelta, tale lunghezza varia a seconda del ComboItem selezionato.

    Io vorrei invece che le dimensioni della JCB fossero sempre uguali, poste naturalmente alla lunghezza del Item più lungo tra le possibili scelte delle 3 JCB.

    Non mi pare che setSize o SetPreferredSIze abbiano grande effetto...

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.