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

    [JAVA] JButton[] - Array di bottoni

    Salve a tutti,

    Oggi programmando mi sono trovato davanti a una situazione che non mi era mai capitata in precedenza, ho necessita di far apparire in schermo un numero imprecisato di pulsanti, e a ognuno di questi devo associare un evento...

    Be... non sono nemmeno arrivato all'evento.
    Riesco a creare un'array di JButton ma poi quando vado a stamparli a schermo non me ne appare che uno solo (precisamente l'ultimo della lista). Vi posto una frazione di codice:

    codice:
    private JButton[] bottoni;
    .....
    public ... start(){
    .....
    
    this.bottoni = new JButton[a];
    
    
    			for(i = 0; i < (a); i++) {
    				this.bottoni[i] = this.copiaMemory;
    				this.bottoni[i].setText(String.valueOf(i));
    				this.pannelloBottom.add(this.bottoniMemory[i]);
    				
    			}
    }
    dove bottoni e' la mia array
    pannellobottoni e' un JPanel di tipo GridLayout

    Grazie in anticipo e buon natale a tutti

    Ps. Sareste cosi' gentili magari anche da anticiparmi il come gestire gli eventi di questi bottoni?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Se non specifichi un gestore di layout (LayoutManager) quello assunto di default sarà FlowLayout, il che, molte volte non ti consente di mostrare comodamente più di un elemento alla volta.
    Prova ad appicciare qualche altro layout manager al tup JPanel, ad esempio, un GridLayout di dimensioni opportune, e quindi ad aggiungere i vari JButton.
    Saluti.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Infatti ho fatto cosi' (ho scritto piu' sotto)
    Praticamete ho usato due LayerManger: un GridLayout dentro un BorderLayout... ma in in questo problema fate finta che sto usando solo un gridlayout

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ah, scusa, non avevo prestato attenzione a quel dettaglio... una cosa comunque: perché fai tutte le operazioni del caso con bottoni[], e poi vai ad aggiungere bottoniMemory[]?
    Chi è copiaMemory?

    Per quanto riguarda la gestione, visto che mi sembra di capire che le etichette di tali bottoni saranno 0..a-1, man mano che li crei, ci aggiungi un ActionListener

    codice:
    for (int i = 0; i < a; i++) {
      bottoni[i] = new JButton(String.valueOf(i));
      pannelloBottom.add(bottoni[i]);
      bottoni[i].addActionListener(this);
    }
    validate();
    La tua classe dovrà implementare ActionListener e quindi dovrai aggiungere un metodo
    codice:
    public void actionPerformed (ActionEvent ae) {
      int buttonIndex = (new Integer(ae.getActionCommand())).intValue();
      //switch su buttonIndex
    }
    Oppure crei la tua classe listener a parte, in caso in cui dovrai gestire anche bottoni di natura diversa per cui un simile controllo come quello che genera l'index in actionPerformed sarebbe privo di senso.
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    il bottone "copia" l'ho inizializzato per dare un senso all'array, dato che quando facevo new JBotton[xx] e cercavo di richiamare un elemento dell'array me lo dava come null, quindi per risolvere questo problema (che pero' non mi convince per niente) ho creato un bottone generico e ho assegnato il puntatore della matrice al puntatore copia.

    Per quanto riguarda il listener che mi hai detto te come faccio ad identificare quale degli N pulsanti e' stato premuto? ce qualcosa del titp ea.getSource ecc e poi con ea posso fare ea.getIndex?

    Grazie ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    allora, per risolvere il problema dell'inizializzazione del singolo bottone:
    -chiarimento: quando fai JButton[] bottoni = new JButton[100] hai inizializzato un array di JButton, ma nessuno degli elementi JButton dell'array è stato inizializzato. Ergo, man mano che li vuoi utilizzare devi fare

    bottoni[i] = new JButton(etichetta); //così ti risparmi la riga del setText(etichetta);

    Se fai per tutti i bottoni

    bottoni[i] = this.bottoneProva;

    o simile, stai facendo un disastro, ossia stai assegnando ad ogni nuovo bottone dell'array la stessa locazione di memoria (sono oggetti dopotutto) di bottoneProva. Quindi, negativo, male, non va bene.

    Per quanto riguarda il listener, to l'ho pure scritto: con ae.getActionCommand() dovresti essere in grado di recuperare l'etichetta del bottone. Ora, mentre questo sicuramente è uno degli approcci che difficilmente utilizzo, visto che tutti i tuoi JButton hanno un naming-scheme regolare e facilmente gestibile, imho, in questo caso ti semplifica la vita rispetto al più efficace .getSource() (e poi qualcosa per andare ad identificare il singolo bottone).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Ok ok...
    Rivedendo a mente lucida tutto il codice mi rendo ora conto della bestialita che ho scritto con il copiaBottone... (sai... e' la classica situazione del ceervello confuso dopo 6 ore di lavoro filato... cominci a fare bordelli...)

    Ora a mente lucida capisco meglio il codice che mi hai scritto... e devo dire che la mia domanda e' stata abbastanza stupida... era tutto chiarissimo

    Grazie ancora, se ho problemi ti faccio sapsere!

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    siamo qui, fino a cottura cerebello.
    Saluti e buone feste.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Hihihi rieccomi qui!, volevo ringraziarti perche il tuo aiuto mi e' servito tantissimo!
    Gia che ci sei mi potresti spiegare piu' o meno gli scopi delle funzioni

    super() - Bene o male ho capito a cosa serve... ma magari una precisazione farebbe comodo
    pack()
    validate()

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    super è un riferimento alla super-classe della classe chiamante.
    pack() - metodo che uso pochissimo: serve a "restringere" il contenitore alle dimensioni minime atte a contenere tutti gli oggetti che gli hai inserito.
    validate() - forza la ricostruzione del layout del contenitore su cui l'hai invocato. Se aggiungi o elimini componenti (JButton, JTextField, pannelli o quant'altro) può darsi che il nuovo stato non venga ridisegnato. Con validate forzi la VM a ridisegnare il tutto.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.