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

    mouseClicked e getComponentAt(x,y)

    Il problema è:
    ho un jPanel che contiene un totale di 169 bottoni organizzati in 13 righe e 13 colonne, con il GridBagLayout.
    I bottoni fanno tutti più o meno la stessa cosa, ciò che cambia è il loro testo e la disposizione nella griglia (ovviamente). Quindi, per non dover trattare singolarmente la gestione di ogni bottone, sarebbe meglio avere un approccio più "generale". Ovvero, quando c'è un click nel jPanel, vorrei sapere quale bottone è stato cliccato. Pensavo di farlo con getComponentAt(evt.getX(), evt.getY()), ma non funziona. Nè tantomeno, come controprova, funziona getComponents() del jPanel, in quanto non restituisce i bottoni come speravo.

    Idee?

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

    Re: mouseClicked e getComponentAt(x,y)

    Originariamente inviato da walkerjitzu
    ho un jPanel che contiene un totale di 169 bottoni organizzati in 13 righe e 13 colonne, con il GridBagLayout.
    Ok

    Originariamente inviato da walkerjitzu
    Quindi, per non dover trattare singolarmente la gestione di ogni bottone, sarebbe meglio avere un approccio più "generale". Ovvero, quando c'è un click nel jPanel, vorrei sapere quale bottone è stato cliccato. Pensavo di farlo con getComponentAt(evt.getX(), evt.getY()), ma non funziona.
    Non è questa la soluzione "bella" e pulita.

    Dovresti precisare che cosa cambia da un pulsante all'altro. Questo servirebbe per valutare l'approccio da usare.
    Dipende se ci deve essere un "comportamento" differente o se basta che ci sia una (o più) "informazione" differente.

    Quindi: precisa e si può poi valutare meglio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    il comportamento tenuto nei confronti di ciascun bottone è indifferente. Le uniche cose che cambiano da un bottone all'altro sono la variabile di riferimento, il testo (ininfluente) e la posizione nella griglia del layout.
    Il codice che "fa fare qualcosa" al bottone cliccato è uguale per tutti

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da walkerjitzu
    Le uniche cose che cambiano da un bottone all'altro sono la variabile di riferimento
    Scusa, ma precisa ancora meglio cosa intendi con questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    nel senso che ovviamente se abbiamo un bottone A e un bottone B, il nome di A non sarà lo stesso di B. Era giusto per specificare proprio ogni cosa

  6. #6
    citando la documentazione di MouseEvent:

    "A mouse action is considered to occur in a particular component if and only if the mouse cursor is over the unobscured part of the component's bounds when the action happens. Component bounds can be obscurred by the visible component's children or by a menu or by a top-level window"

    non so come farlo funzionare. Altre idee ben accette

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da walkerjitzu
    "A mouse action is considered to occur in a particular component if and only if the mouse cursor is over the unobscured part of the component's bounds when the action happens. Component bounds can be obscurred by the visible component's children or by a menu or by a top-level window"
    Ripeto: dimentica MouseEvent per gestire i tuoi N pulsanti. Ogni pulsante genera un ActionEvent che puoi trattare in un ActionListener. Questa è la soluzione migliore.

    Poi come fare qualcosa di differente (o con dati differenti) a seconda del pulsante .... ci sono svariati approcci. Cito ora quelli che mi vengono in mente:

    1) registrare lo stesso ActionListener per tutti i pulsanti, poi si distingue il pulsante dal "source" dell'evento:

    Object source = event.getSource();
    if (source == pulsanteA) { fai_questo; }
    else if (source == pulsanteB) { fai_quest'altro; }
    .....

    chiaramente richiede di tenersi i riferimenti a tutti i pulsanti e non è molto "generico" quindi.

    Se quello che deve differire da un pulsante all'altro è poter ottenere uno o più valori differenti, allora:

    2) si estende JButton, es. MyButton, e si definiscono delle proprietà in più. Poi si registra lo stesso listener e l'oggetto source lo si "casta" al MyButton (presupponendo che si sappia a priori che il source saranno solo quei tuoi pulsanti). Quindi si esaminano le proprietà aggiuntive.

    3) si definisce un listener specifico che contiene delle proprietà aggiuntive, quindi per ogni pulsante si istanzia il listener con le proprietà specifiche e lo si assegna al pulsante. Nel actionPerformed quindi i dati utili provengono del listener, non dal pulsante.

    4) si usa una mappa IdentityHashMap, i pulsanti sono le chiavi, i valori sono quello che ti pare (anche oggetti complessi). Nel listener, dall'evento si ottiene il source (il tuo pulsante) e si va a prendere i dati specifici dalla mappa.

    Questi sono gli approcci che mi vengono in mente ... scegli tu i base a cosa devi fare di preciso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    quello che devo fare, in fin dei conti, è semplicemente avere una variabile alla quale viene assegnato il bottone cliccato, l'azione intrapresa sarà uguale per tutti.
    Potrei tenere un array Component[] creato dopo l'inizializzazione del frame, contenente tutti e 169 i bottoni, e quando c'è un click nel Panel cerco nell'array il bottone premuto, a seconda se contiene o no il punto cliccato (magari con un metodo fatto ad hoc)

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da walkerjitzu
    quello che devo fare, in fin dei conti, è semplicemente avere una variabile alla quale viene assegnato il bottone cliccato, l'azione intrapresa sarà uguale per tutti.
    Potrei tenere un array Component[] creato dopo l'inizializzazione del frame, contenente tutti e 169 i bottoni, e quando c'è un click nel Panel cerco nell'array il bottone premuto, a seconda se contiene o no il punto cliccato (magari con un metodo fatto ad hoc)
    Il riferimento al pulsante, ripeto ancora una volta, è nel "source" del ActionEvent.
    Se ti basta assegnare questo riferimento ad una tua variabile, non vedo questioni particolari.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    quello che intendi tu, se non sbaglio, è andare a definire 169 actionPerformed diversi. Io invece sto cercando un modo per stabilire, in base ad un click nel jPanel, quale dei 169 bottoni è stato cliccato

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.