Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453

    [Java swing] GUI dinamica a runtime

    Ciao ragazzi,

    ho iniziato da poco a lavorare con le java swing: mi sto appoggiando a netbeans, perchè quel che mi interessa in questo momento è la logica dell'applicazione, il fatto di dover fare l'interfaccia grafica al momento è solo una complicazione, purtroppo necessaria.

    Le mie necessità però superano (credo) il supporto che net beans mi può dare, perciò eccomi qui a chiedervi un aiutino.

    Devo fare un'interfaccia abbastanza dinamica. Alcuni esempi:

    - leggo da db un certo numero di righe, e per ciascuna riga creo uno o più elementi grafici in un pannello (ad esempio una label ed un campo testo)
    - man mano che l'utente incrementa/decrementa un campo spinner vengono aggiunti/rimossi dei campi testo in un pannello, uno sotto l'altro

    E' questa dinamicità della GUI a runtime che non sto riuscendo a realizzare.
    Ho fatto delle prove ma probabilmente la mia scarsa conoscenza della programmazione di GUI mi sta facendo trascurare qualcosa.

    Ad esempio, per il secondo caso, ho scritto questo codice:


    codice:
        private void numFasceOrarieStateChanged(javax.swing.event.ChangeEvent evt) {
    
            int num = Integer.parseInt(numFasceOrarie.getValue().toString());  // (anche questo mi sa che si poteva fare in modo più furbo)
            JTextField dynamicTextField;
            for(int i=0; i<num; i++){
                dynamicTextField = new JTextField("fascia_"+i);
                configurationTab.add(dynamicTextFields);
                
            }
        }
    intanto volevo vedere se incrementando lo spinner compariva qualcosa, in un secondo momento volevo poi fare la gestione che dicevo su (bisognerà fare una lista di textFields, poi quando incremento lo spinner ne aggiungo uno quando decremento elimino l'ultimo). Però non compare niente ora come ora. Cosa mi sto scordando?

    Per completezza riporto anche il codice che netbeans mi ha generato per quel pannello configurationTab:



    vi ringrazio!
    codice:
            javax.swing.GroupLayout configurationTabLayout = new javax.swing.GroupLayout(configurationTab);
            configurationTab.setLayout(configurationTabLayout);
            configurationTabLayout.setHorizontalGroup(
                configurationTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(configurationTabLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(configurationTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(numFasceOrarie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(38, Short.MAX_VALUE))
            );
            configurationTabLayout.setVerticalGroup(
                configurationTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(configurationTabLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(numFasceOrarie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(268, Short.MAX_VALUE))
            );
    grazie a tutti

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

    Re: [Java swing] GUI dinamica a runtime

    Originariamente inviato da Kilin
    Però non compare niente ora come ora. Cosa mi sto scordando?
    La questione è molto semplice: la add() sul "contenitore" per aggiungere un componente chiaramente va fatta, ed è il minimo. Ma serve altro, se aggiungi dopo che il contenitore è già visibile, che dipende dal fatto se il contenitore usa (e quale) o no un layout manager.

    Se non usa un layout manager si ha il posizionamento "assoluto" e il componente va anche disposto con setBounds() o setLocation()+setSize() (e questo in ogni caso) e poi un repaint() sul componente.

    Se usa un layout manager ... dipende quale. Per quelli più semplici perlomeno es. BorderLayout, FlowLayout, GridLayout generalmente basta un validate() sul contenitore per rivalidare il tutto. Ma con certi layout manager potrebbe non essere così semplice: personalmente in passato ho avuto "noie" con GridBagLayout.

    Originariamente inviato da Kilin
    Per completezza riporto anche il codice che netbeans mi ha generato per quel pannello configurationTab:

    codice:
    javax.swing.GroupLayout configurationTabLayout = new javax.swing.GroupLayout(configurationTab);
    Questo è un'altra questione/problema. GroupLayout e SpringLayout sono 2 layout manager di Swing tra i più complicati che ci sono.
    Permettono di fare un po' tutto ma ad un prezzo: sono complessi per quanto riguarda i "constraint" (i "vincoli") da specificare per dire dove/come posizionare/dimensionare i componenti!

    E come puoi vedere dal codice generato dal tuo NetBeans, è molto prolisso (mette tutti i tipi qualificati), criptico (usa il method chaining a().b().c() .....) ed è poco comprensibile/manutenibile.

    Questo è uno dei vari motivi per cui sarebbe sempre bene non farsi mai generare del codice da un IDE, specialmente per quanto riguarda la GUI. Ma scrivere la gestione della interfaccia da zero "a mano" sfruttando eventualmente layout manager più semplici.
    Lo dico spesso, la abilità in AWT/Swing sta solo nel saper "inscatolare" componenti dentro contenitori, dentro altro, ecc.... sfruttando eventualmente diversi layout manager.

    Se vuoi aggiungere componenti nel GroupLayout devi specificare i constraint per un componente. Ma per farlo devi capire come funziona GroupLayout:
    - javadoc GroupLayout
    - How to Use GroupLayout
    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 L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    ho capito.... intanto ho usato soluzioni di ripiego (form fissi che vengono popolati in maniera diversa quando seleziono un certo record, ad esempio cliccando su un nodo di un JTree) nell'attesa di imparare meglio swing ed i layout manager...

    per il fatto che sia meglio evitare gli IDE per la generazione del codice relativo ad interfacce grafiche, aggiungo un dettaglio di cui mi sono accorto ora ora: per ogni componente aggiunto all'interfaccia tramite netbeans, si può scegliere l layoutmanager che si vuole utilizzare, quindi già questo evita problemi tipo quello che ho postato, ovvero che netbeans usi layout manager complessi e criptici su cui è difficile metter le mani. Si può selezionare un layout manager semplice, o al limite dire a netbeans di non usarne nessuno...credo possa essere utile!

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.