我在代码中遇到的问题是,当它运行button.setVisible(true);
时,它不会将按钮设置为可见,直到所有其他if
语句都通过,这真让我感到困惑
我试图让西蒙说,这try
- catch
做的是它使顺序中的按钮闪烁,以便用户可以知道它是哪个按钮接下来。
我是编程新手,所以欢迎任何提示和建议。 谢谢你看看!
try {
inputOrder.clear();
// System.out.println("THIS IS INPUT" + inputOrder);
Sequence.add(randomNumber());
int f = 0;
for (; f < Sequence.size(); f++) {
//Thread.sleep(2000);
if (Sequence.get(f) == 1) {
try {`
btnNewButton.setVisible(false);
Thread.sleep(1000);
} catch (InterruptedException e1) {
}
Thread.sleep(1000);
System.out.println("it ran here");
btnNewButton.setVisible(true);
}
if (Sequence.get(f) == 2) {
try {
btnBlue.setVisible(false);
Thread.sleep(1000);
} catch (InterruptedException e1) {
}Thread.sleep(1000);
System.out.println("it ran here");
btnBlue.setVisible(true);
}
if (Sequence.get(f) == 3) {
try {
btnYellow.setVisible(false);
Thread.sleep(1000);
} catch (InterruptedException e1) {
}Thread.sleep(1000);
System.out.println("it ran here");
btnYellow.setVisible(true);
}
if (Sequence.get(f) == 4) {
try {
btnGreen.setVisible(false);
Thread.sleep(1000);
} catch (InterruptedException e1) {
}
Thread.sleep(1000);
System.out.println("it ran here");
btnGreen.setVisible(true);
}
System.out.println(Sequence);
// Order.add(getColor(Sequence.get(f)));
System.out.println(Order);
text.setText(String.valueOf(Order.size()));
}
btnNextRound.setVisible(false);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
答案 0 :(得分:0)
看起来这种情况发生是因为你在UI线程中执行此操作,并且没有时间执行EventQueue,因为你强制睡眠UI线程,因为这个线程一旦完成就有机会实际完成绘制所有的睡眠电话。
为了获得所需的输出,我认为你应该将睡眠逻辑移动到一个单独的线程或SwingWorker
。如果将逻辑移动到单独的线程,则需要使用EventQueue.InvokeLater
启用按钮。
答案 1 :(得分:0)
Java Swing GUI的工作方式是一切都是一个接一个地发生。只有当您发布的整个方法完成后,才会显示下一个GUI事件(例如需要重新绘制事件以显示该按钮不再可见)。做一个Thread.sleep只会让你的方法需要更长的时间才能完成。结果是您的UI被冻结,因为在所有睡眠调用之后,其他事件(例如鼠标,键盘或重新绘制事件)都无法运行。
要在Java中执行动画,您应该使用javax.swing.Timer
类而不是Thread.sleep
。下面我发布了一个计时器的快速示例,启动时会导致按钮闪烁。这并不能完全解决您的问题(您还需要循环播放,但是您确实需要另一个计时器来实际安排按钮何时闪烁,以便它们不会立即发生)。
import javax.swing.Timer
/**
* Timer that causes a button to flash (become invisible for 1 second, and then become visible again).
*/
public class ButtonFlashTimer extends Timer {
private final JButton buttonToFlash;
public ButtonFlashTimer(JButton button) {
super(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// This method is called every 1000 ms (until we tell
// it to stop). This allows us to perform the next "step"
// in the animation.
boolean isVisible = buttonToFlash.isVisible();
if (isVisible) {
buttonToFlash.setVisible(false);
} else {
buttonToFlash.setVisible(true);
// Once we've flashed, stop the timer (don't keep flashing).
stop();
}
}
});
buttonToFlash = button;
// Become invisible immediately; the 1000 ms will be the time between the first
// call to the actionPerformed (which will set it as invisible) and the second
// call (which makes it visible again).
setInitialDelay(0);
setRepeats(true);
}
}