Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Disegnare pulsanti a runtime

    Vorrei fare in modo di creare una finestra con un certo numero di pulsanti (funzionanti) questo numero dipende da un dato presente in un file di testo.
    Ad ogni pulsante deve essere associata la stessa azione (aprire un'altra schermata) ma fornedo un parametro diverso (il numero del tavolo).
    In generale, come posso fare questo?
    E come posso "posizionare" i pulsanti nella finestra?

    [questa era la parte di progetto che doveva fare un'altra persona che L'ULTIMO GIORNO UTILE ci ha dato buca ]

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ad ogni pulsante deve essere associata la stessa azione (aprire un'altra schermata) ma fornedo un parametro diverso (il numero del tavolo).
    In generale, come posso fare questo?
    Ci sono almeno 2 modi per "incapsulare" un dato (o più di uno) specifico per ciascun pulsante da usare alla "azione" del pulsante:

    1) Incapsularlo nel ActionListener, cioè la tua classe del listener avrà un apposito campo di istanza e il relativo costruttore.
    Es.

    pulsante1.addActionListener(new MyActionListener(dato1));
    pulsante2.addActionListener(new MyActionListener(dato2));


    2) Incapsularlo nel pulsante. Se si tratta di un banale String, nota che ogni pulsante ha la proprietà "actionCommand", che è fatta apposta per fare differenziazioni di questo tipo. Se si tratta di altro tipo di dato no. In tal caso si può estendere JButton.
    Es.

    pulsante1 = new MyButton(dato1);
    pulsante2 = new MyButton(dato2);


    Nel actionPerformed (basta 1 sola istanza del listener):

    MyButton b = (MyButton) event.getSource();
    Xyz dato = b.getXyz(); // Metodo getter da fare appositamente!


    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    E come posso "posizionare" i pulsanti nella finestra?
    Dipende come vuoi disporli .... in griglia? Tutti in riga? O in colonna? Altro?
    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
    Sep 2012
    Messaggi
    442
    Ma come posso creare un numero di pulsanti che dipende da una variabile numerica?
    Ad esempio una cosa tipo:

    for (int i=1; i<=tablesNumber; i++) {
    button= new JButton();
    }

    Immagino che non vada bene perché così ogni pulsante si chiamerebbe button... io invece dovrei avere una cosat ipo button1, button2, etc...
    Il dato da "incapsulare" in ogni pulsante è un semplice numero intero. Quindi va bene che button1 porti con sé il valore 1, button2 il 2 etc... niente di trascendentale insomma.
    La disposizione va bene in griglia.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Immagino che non vada bene perché così ogni pulsante si chiamerebbe button...
    Non centra qui tanto il nome della variabile!

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    io invece dovrei avere una cosat ipo button1, button2, etc...
    No, come minimo con un array (o al limite collezione List). Chiaramente solo se hai bisogno di referenziare successivamente il pulsante i-esimo ... cosa che comunque non è nemmeno detto che sia necessaria.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    La disposizione va bene in griglia.
    GridLayout o GridBagLayout, quale dei due dipende dai criteri esatti di dimensionamento e "spartizione" dello spazio che è necessario.
    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
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non centra qui tanto il nome della variabile!
    In che senso?


    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, come minimo con un array (o al limite collezione List). Chiaramente solo se hai bisogno di referenziare successivamente il pulsante i-esimo ... cosa che comunque non è nemmeno detto che sia necessaria.
    Io voglio solo che i pulsanti vengano visualizzati e che sia possibile cliccarci sopra per aprire la stessa schermata passando però un valore numerico diverso per ogni pulsante cliccato.
    Ad esempio clicco sul pulsante Tavolo1, mi si deve aprire la finestra Ordinazioni e l'ordinazione da generare (dati che vengono salvati in un db) deve riferire Tavolo1, se clicco Tavolo2 lo stesso però l'ordinazione deve riferire Tavolo2 etc...
    Quindi l'array mi serve o no?

    Quote Originariamente inviata da andbin Visualizza il messaggio
    GridLayout o GridBagLayout, quale dei due dipende dai criteri esatti di dimensionamento e "spartizione" dello spazio che è necessario.
    La finestra deve dimensionarsi a seconda del numero di pulsanti che deve contenere.

    Grazie

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    In che senso?
    Che non devi "fissarti" sul fatto che la variabile (se non usi un array) è una sola .... perché magari serve solo come variabile temporanea.
    Spiego con esempio abbozzato:

    codice:
    for (int i = 0; ................) {
        JButton button = new JButton( .....etichetta..... );
        int dato = ..........;
        button.addActionListener(new MyActionListener(dato));
        pannello.add(button);
    }

    Anche se la variabile 'button' (e 'dato') è una sola e ad ogni ciclo ha un reference ad un nuovo JButton, non importa qui. Quello che importa è aver agganciato il pulsante al suo listener con il suo dato e aver inserito il pulsante nel pannello (che potrebbe avere es. un GridLayout).

    Certo, qui non ho usato un array, quindi successivamente non puoi fare: "voglio il JButton i-esimo" ma .... magari non ti serve nemmeno visto che tutto è incapsulato/agganciato a dovere (ogni JButton ha il suo oggetto listener e ognuno di questi ha il suo dato).

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Quindi l'array mi serve o no?
    Non necessariamente ... e visto lo scenario che hai descritto, direi di no.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    La finestra deve dimensionarsi a seconda del numero di pulsanti che deve contenere.
    Sì, però se vuoi una griglia devi stabilire alcune cose: cosa imponi? il numero di colonne? o di righe? o è in base al numero di pulsanti? (es. cose particolari tipo: fino a 9 usi 3 colonne, fino a 16 usi 4 colonne, ecc....)
    Cerca di precisare, se vuoi risposte o comunque avere chiaro cosa vuoi ottenere.
    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
    Sep 2012
    Messaggi
    442
    Ho provato così:

    codice:
    private void initComponents() {
            
            jPanel1 = new javax.swing.JPanel();
            
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            for (int i=1; i<=tablesNumber; i++) {
                JButton button= new JButton(Integer.toString(i));
                //button.setActionCommand(Integer.toString(i));
                button.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e) {
                            new SingoloTavolo().setVisible(true);
                        }
                });
                jPanel1.add(button);
            }
            javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 400, Short.MAX_VALUE)
                );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 300, Short.MAX_VALUE)
                );
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                );
            
            pack();
            setLocationRelativeTo(null);
        }// </editor-fold>//GEN-END:initComponents
    Ma i pulsanti non si vedono :-/
    Penso abbia a che fare con il fatto che viene impostato per il panel il GroupLayout...ma lì non c'è nessuna informazione di dove devono essere posizionati i pulsanti... è così?
    Questo è codice generato in parte da NB e viene sempre messo il GroupLayout di default. E' molto comodo se devi disegnare la finestra posizionando bene tutto, però metterci le mani è un casino...

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    codice:
                button.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e) {
                            new SingoloTavolo().setVisible(true);
                        }
                });
    Innanzitutto nel actionPerformed non capisco come tu possa differenziare tra i vari pulsanti visto che fai:

    new SingoloTavolo().setVisible(true);

    in cui non vedo alcuna informazione relativa al "contesto" di ciascun pulsante.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Penso abbia a che fare con il fatto che viene impostato per il panel il GroupLayout...ma lì non c'è nessuna informazione di dove devono essere posizionati i pulsanti... è così?
    Sì, è così. Non ci sono i constraint ("vincoli") di posizionamento/dimensionamento per i pulsanti.

    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Questo è codice generato in parte da NB e viene sempre messo il GroupLayout di default. E' molto comodo se devi disegnare la finestra
    posizionando bene tutto, però metterci le mani è un casino...
    GroupLayout è uno dei layout manager più complessi che ci siano. Viene usato spesso dai GUI editor. Io personalmente mi rifiuto di usarlo ....
    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
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto nel actionPerformed non capisco come tu possa differenziare tra i vari pulsanti visto che fai:
    new SingoloTavolo().setVisible(true);
    in cui non vedo alcuna informazione relativa al "contesto" di ciascun pulsante.
    Sì infatti ma quello lo vedo dopo, ho solo abbozzato del codice.
    Per adesso mi piacerebbe almeno riuscire a visualizzare i pulsanti XD


    Sì, è così. Non ci sono i constraint ("vincoli") di posizionamento/dimensionamento per i pulsanti.
    GroupLayout è uno dei layout manager più complessi che ci siano. Viene usato spesso dai GUI editor. Io personalmente mi rifiuto di usarlo ....
    Fai bene! E' impossibile da usare a mano :-/
    Anyway, ho modificato così:

    codice:
        private void initComponents() {
            
            jPanel1 = new javax.swing.JPanel();
            
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            for (int i=1; i<=tablesNumber; i++) {
                JButton button= new JButton(Integer.toString(i));
                //button.setActionCommand(Integer.toString(i));
                button.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e) {
                            new SingoloTavolo().setVisible(true);
                        }
                });
                jPanel1.add(button);
            }
    
            jPanel1 = new JPanel(new GridLayout(9,5));
            jPanel1.setBackground(new Color(255, 255, 153));
            jPanel1.setBorder(new LineBorder(Color.BLACK));
            pack();
            setLocationRelativeTo(null);
        }
    Ma adesso tutto ciò che vedo è un rettangolino microscopico che se lo allargo mi fa vedere la finestra mac heè comunque vuota, non ci sono i pulsanti. Dove sbaglio? Non sono capace di fare la grafica a mano (

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ma adesso tutto ciò che vedo è un rettangolino microscopico che se lo allargo mi fa vedere la finestra mac heè comunque vuota, non ci sono i pulsanti. Dove sbaglio? Non sono capace di fare la grafica a mano (
    jPanel1 dove vuoi inserirlo? Non vedo nulla a riguardo nel codice sopra ...
    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.