Java Swing; 两个类,如果陈述和新的行动听众放在哪里?

纯粹的初学者问题在这里。 我正在修改一个代码,现在我坚持下面的问题。

我的计时器在上层被调用。 但是我的int数在下面的类中被调用。

每当我添加一个if语句像;

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

我得到的错误,因为int在下面的类和t(计时器)在上面的类。

  1. 当涉及两个类时,如何添加if语句?

  2. 如果我想添加一个新的actionlistenerbutton来停止计数,我把这个在上面或下面的类?

代码在这里

提前致谢

由于ClockListener是一个嵌套类 (较低),因此封闭实例(较高)可以访问该侦听器的私有字段。 如果你有一个ClockListener实例的ClockListener

 ClockListener cl = new ClockListener(); 

你可以用它来初始化你的计时器

 Timer t = new Timer(1000, cl); 

你可以在你的testing中使用它:

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

附录:作为参考,下面是使用JToggleButton控制计时器的程序变体。 正如前面所提到的 ,你曾经使用Calendar来最小化Timer漂移。 和你一样,我放弃了在低分辨率应用中无关的方法。

 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 actionPerformed(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(); } }); } } 

其范围决议。 使t公开(不可取)或在第二个类中创build另一个计时器,在调用它时将通过第二个类的构造器。 它会引用原来的计时器。