【发布时间】:2020-04-17 22:20:52
【问题描述】:
我正在尝试在 java 中构建一个计时器。
预期输出:
当你运行程序时,会出现一个窗口,里面有一个大的“0”。
一旦用户按下键盘上的任意键,数字就会每秒增加 1。
这就是我所拥有的。
import javax.swing.*;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class TimerTest implements KeyListener {
static final int SCREEN_WIDTH = 960;
static final int SCREEN_HEIGHT = 540;
static boolean timerStarted;
static int keyPressedNum; //amount of times the user pressed any key.
static JLabel label;
static int currentTime;
public static void main(String[] args) {
JFrame frame = new JFrame("TimerTest");
JPanel panel = new JPanel();
label = new JLabel();
label.setFont(new Font("Arial", Font.PLAIN, 256));
label.setText("0");
label.setHorizontalAlignment(SwingConstants.CENTER);
panel.setLayout(new BorderLayout());
panel.add(label, BorderLayout.CENTER);
frame.addKeyListener(new TimerTest());
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
frame.setResizable(false);
frame.setVisible(true);
while (true) {
while (TimerTest.timerStarted == false) {
if (TimerTest.timerStarted == true) {break;}
}
try {Thread.sleep(1000);}
catch (InterruptedException ex) {ex.printStackTrace();}
currentTime++;
label.setText(String.valueOf(currentTime));
}
}
public void keyPressed(KeyEvent e) {
System.out.println("Keypress indicated.");
TimerTest.timerStarted = true;
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
当我按下任意键时,程序会将timerStarted 设置为真。
因为timerStarted 是真的,所以我期待这部分:
while (TimerTest.timerStarted == false) {
if (TimerTest.timerStarted == true) {break;}
}
跳出循环。
当我运行程序并按任意键时,命令行只会打印:Keypress indicated.,并且不会跳出循环。
现在是奇怪的部分:
我尝试在 while 块中添加一些代码,像这样。
while (TimerTest.timerStarted == false) {
System.out.println("currently stuck here...");
//(I simply added a println code)
if (TimerTest.timerStarted == true) {break;}
}
令人惊讶的是,当我这样做时,程序就像我想要的那样运行。它跳出那个循环,计时器开始运行。
这让我很困惑。添加System.out.println(); 可以解决问题...?
为什么没有System.out.println() 会让我无法跳出循环?
任何解释将不胜感激 =)
【问题讨论】:
-
TimerTest.timerStarted == true从逻辑上讲永远不会落入TimerTest.timerStarted == false之下(除非在两个if处决之间产生可预测的变化,无法想象的精确) -
是的,我知道这与没有
TimerTest.timerStarted == true几乎是一回事。但是,这两种情况都不起作用。 -
您想要跳出循环的实际/真实条件是什么?我在循环中看不到任何改变
TimerTest.timerStarted的值。外面改了吗? -
我想在
timerStarted= true 时跳出循环。我使用 while 循环“等待”直到timerStarted等于 true -
IIRC,
break将跳出最近的循环,而不是所有循环。你的while中有一个while,所以当你突破内部while时,你应该仍然在外部while。
标签: java