Java Swing; Due classi, dove mettere se dichiarazioni e nuovi actionlisteners?

Pura domanda per principianti qui. Sto modificando un codice e sono ora bloccato sulle seguenti domande;

Il mio timer è chiamato nella class superiore. Ma il mio int count viene chiamato nella class qui sotto.

Ogni volta che aggiungo una dichiarazione if come;

if (count == 2) { t.stop();} 

ottengo errori perché l’int è nella class sottostante e il t (timer) nella class sopra.

  1. Come posso aggiungere un’istruzione if se sono coinvolte due classi?

  2. E se voglio aggiungere un nuovo actionlistener per un pulsante per fermare il conteggio, lo metto nella class sopra o sotto?

Codice qui

Grazie in anticipo

Poiché ClockListener è una class nidificata (inferiore), l’istanza che la include (in alto) può accedere ai campi privati ​​del listener. Se hai un riferimento a un’istanza di ClockListener ,

 ClockListener cl = new ClockListener(); 

puoi usarlo per inizializzare il tuo timer

 Timer t = new Timer(1000, cl); 

e puoi usarlo nel tuo test:

 if (cl.count == 2) { t.stop(); } 

Addendum: per riferimento, ecco una variante del programma che utilizza un JToggleButton per controllare il timer. Come suggerito in precedenza , hai usato Calendar per minimizzare la deriva del Timer . Come te, ho abbandonato l’approccio come irrilevante in un’applicazione a bassa risoluzione.

 import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.Timer; /** @see https://stackoverflow.com/questions/5528939*/ class ClockExample extends JFrame { private static final int N = 60; private static final String stop = "Stop"; private static final String start = "Start"; private final ClockListener cl = new ClockListener(); private final Timer t = new Timer(1000, cl); private final JTextField tf = new JTextField(3); public ClockExample() { t.setInitialDelay(0); JPanel panel = new JPanel(); tf.setHorizontalAlignment(JTextField.RIGHT); tf.setEditable(false); panel.add(tf); final JToggleButton b = new JToggleButton(stop); b.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (b.isSelected()) { t.stop(); b.setText(start); } else { t.start(); b.setText(stop); } } }); panel.add(b); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(panel); this.setTitle("Timer"); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } public void start() { t.start(); } private class ClockListener implements ActionListener { private int count; @Override public void actionPerformsd(ActionEvent e) { count %= N; tf.setText(String.valueOf(count)); count++; } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ClockExample clock = new ClockExample(); clock.start(); } }); } } 

La sua risoluzione dell’ambito. Rendi pubblico (non consigliabile) o crea un altro timer nella seconda class che passerai attraverso il costrutto della seconda class quando lo invocherai. Farà riferimento al timer originale.