Java Swing; 两个类,如果陈述和新的行动听众放在哪里?
纯粹的初学者问题在这里。 我正在修改一个代码,现在我坚持下面的问题。
我的计时器在上层被调用。 但是我的int数在下面的类中被调用。
每当我添加一个if语句像;
if (count == 2) { t.stop();}
我得到的错误,因为int在下面的类和t(计时器)在上面的类。
-
当涉及两个类时,如何添加if语句?
-
如果我想添加一个新的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另一个计时器,在调用它时将通过第二个类的构造器。 它会引用原来的计时器。