mi sa che devo comunque passargli i panel al mio Listener
per poter modificare gli oggetti contenuti su i vari panel.
mi sa che devo comunque passargli i panel al mio Listener
per poter modificare gli oggetti contenuti su i vari panel.
scusa ma la label dove l'hai dichiarata? Puoi creare un metodo di tipo static nella stessa classe in cui hai la label da modificare, che ti modifica appunto il valore della label (scusa il gioco di parole)...quindi nel listener al momento opportuno chiami questo metodo che ti modifica il contenuto della label...
la label è dichiarata nel panelA
la modifica viene invocata cliccando un tasto nel panelB
potrei istanziare nel panelA il mio Listener,passandogli i sotto panel, e poi lo pass0 a i panelB e C in modo da poterlo associare sui pilsanti.
cosa ne pensi.
Io creerei un metodo init(Gestore-Eventi) all'interno della classe del panenllo che ha il bottone.
Poi nel "probabile" main della tua applicazione:
// creo pannello a
aPAnel a = new aPanel();
// creo pannello b
bPanel b = new bPanel();
// crei il gestore eventi passandogli un riferimento
// al pannello che ha la label da modificare.
// Il gestore venti userà questo riferimento
// per accedere alla label da modificare
EventManager evtManager = new EventManager(b);
// inizializzi il pannello col bottone da monitorare
// passando il gestore eventi al metodo init()
a.init(evtManager);
Il metodo init(Gestore-Eventi) non farà altro che registrare evtManager come ascoltatore eventi del bottone del pannello a:
init(EventManager e) {
button.addActionListener(e);
}
Poi nel metodo actionPerformed(), testi se l'evento è generato da "button" e tramite il riferimento al pannello "b" col quale hai costruito il gestore eventi cambi la label con riferimento_a_b.label.setText("blabla")
Sì: devi passare come parametri (al costruttore, ad esempio) all'ActionListener i riferimenti ai pannelli con cui vuoi lavorare.
Vediamo di costruire un piccolo esempio:
Questa è una situazione molto generale. Nel particolare, se ad esempio hai solamente un pulsante nel Pannello1, non è necessario passare anche il suo riferimento all'ActionListener, risparmiando un parametro nel costruttore e altra complessità. Comunque, questo è un caso abbastanza generale.codice:public class Listener implements ActionListener { private MioPanel1 mp1; // Riferimento al pannello con il pulsante private MioPanel2 mp2; // Riferimento al pannello con la Label public Listener(MioPanel1 mp1, MioPanel2 mp2) { this.mp1 = mp1; this.mp2 = mp2; } public void actionPerformed(ActionEvent ae) { // L'utente ha cliccato: vediamo quale pulsante JButton jb = (JButton) ae.getSource(); if (jp.equals( mp1.getPulsante1() )) { // clic sul pulsante 1 mp2.setLabel("Pulsante 1"); } else { // clic sul pulsante 2 mp2.setLabel("Pulsante 2"); } } } public class MioPanel1 extends JPanel { private JButton jb1; private JButton jb2; public MioPanel1() { jb1 = new JButton("Pulsante 1"); jb2 = new JButton("Pulsante 2"); add(jb1); add(jb2); } public void setListener(Listener l) { jb1.addActionListener( l ); jb2.addActionListener( l ); } public JButton getPulsante1() { return jb1; } public JButton getPulsante2() { return jb2; } } public class MioPanel2 extends JPanel { private JLabel lbl; public MioPanel2() { lbl = new JLabel("aspetto"); add( lbl ); } public void setLabel(String s) { lbl.setText( s ); } } public class Esegui { public static void main(String [] args) { MioPanel1 mp1 = new MioPanel1(); MioPanel2 mp2 = new MioPanel2(); Listener ls = new Listener(mp1, mp2); JFrame jf = new JFrame("Finestra"); jf.getContentPane().setLayout( new GridLayout(1, 2) ); jf.add(mp1); jf.add(mp2); jf.setSize(800, 600); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); } }
Non l'ho provato perchè l'ho scritto al volo, ma dovrebbe andare.
Ciao.![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
OK
vedo che siete daccordo con me per passare i panel interessati.
grazie