爪哇摇摆;两个类,在哪里放置 if 语句和新的 actionlistener?
Posted
技术标签:
【中文标题】爪哇摇摆;两个类,在哪里放置 if 语句和新的 actionlistener?【英文标题】:Java Swing; Two classes, where to put if statements and new actionlisteners? 【发布时间】:2011-07-28 14:06:37 【问题描述】:这里是纯初学者问题。 我正在修改代码,现在陷入以下问题;
我的计时器在上层类中被调用。但是我的 int 计数正在下面的类中调用。
每当我添加一个 if 语句时;
if (count == 2) t.stop();
我收到错误,因为 int 在下面的类中,而 t(计时器)在上面的类中。
当涉及到两个类时,如何添加 if 语句?
如果我想为按钮添加一个新的 actionlistener 来停止计数, 我应该把它放在上面还是下面?
Code here
提前致谢
【问题讨论】:
顺便说一句,JPanel
的默认布局是FlowLayout
。
【参考方案1】:
因为ClockListener
是nested class(下),封闭实例(上)可以访问监听器的私有字段。如果你引用了ClockListener
的实例,
ClockListener cl = new ClockListener();
你可以用它来初始化你的计时器
Timer t = new Timer(1000, cl);
你可以在你的测试中使用它:
if (cl.count == 2) t.stop();
附录:作为参考,这是您的程序的一个变体,它使用JToggleButton
来控制计时器。正如earlier 建议的那样,您使用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://***.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();
);
【讨论】:
作为参考,我已经包含了您的术语lower
和 upper
,但 correct 术语是 inner
(用于您的非静态、嵌套的 ClockListener
)和 @987654337 @(为你的外在JFrame
)。
一点也不;术语可能晦涩难懂。我已经添加了教程的链接。
但是那我还需要这条线吗? javax.swing.Timer t = new javax.swing.Timer(1000, new ClockListener()); t.start();
是的,如果你想调用t
的任何方法;但请使用Timer t = new Timer(1000, cl)
,否则您将拥有两个ClockListener
实例,其中只有一个实例的count
会发生变化。
是的,因为现在错误说,定时器 t 已经被调用了【参考方案2】:
它的范围分辨率。将 t 公开(不建议)或在第二类中创建另一个计时器,当您调用它时,您将通过第二类的构造函数。它将引用原始计时器。
【讨论】:
以上是关于爪哇摇摆;两个类,在哪里放置 if 语句和新的 actionlistener?的主要内容,如果未能解决你的问题,请参考以下文章