我正在做一个反应时间游戏,其中一个按钮将变为绿色,你必须尽快点击它,但按钮不会改变颜色。有人能告诉我为什么会这样吗?另外,我怎么能让我的程序等到一个随机时间(方法在下面)然后改变颜色?我尝试使用Thread.sleep但无法使其正常运行。
mport java.awt.Color;
import java.util.Random;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Game extends JFrame implements ActionListener {
double start = System.nanoTime();
double end;
String startTime = String.valueOf(start);
String endTime = String.valueOf(end);
private JTextField displayTime = new JTextField(15);
private JButton stopButton = new JButton("STOP");
DecimalFormat deci = new DecimalFormat();
Font f = new Font("ARIAL", Font.BOLD, 25);
public Game() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
deci.setMaximumFractionDigits(4);
deci.setMinimumFractionDigits(1);
stopButton.addActionListener(this);
stopButton.setPreferredSize(new Dimension(250, 250));
stopButton.setFont(f);
stopButton.setBackground(Color.red);
add(displayTime);
add(stopButton);
pack();
setVisible(true);
waitRandom();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == stopButton) {
end = System.nanoTime();
double time = end - start;
double seconds = time / Math.pow(10, 9);
String finalTime = String.valueOf(deci.format(seconds));
displayTime.setFont(f);
displayTime.setAlignmentX(LEFT_ALIGNMENT);
displayTime.setText(finalTime + " sec.");
}
}
public void waitRandom() {
Random random = new Random();
int randomNumber = random.nextInt(10);
int randomTime = randomNumber * 100;
stopButton.setBackground(Color.green);
stopButton.setOpaque(true);
System.out.println(randomTime);
}
}
答案 0 :(得分:1)
问题是,什么“看起来”像按钮背景,不是。如果你添加
,它就是“内容”按钮 stopButton.setContentAreaFilled(false);
到waitRandom
方法,您会看到......
答案 1 :(得分:0)
在构造函数中进行所有UI设置是狡猾且容易出错的,但我猜测真正的问题是你不允许UI在事件派发线程上进行设置,渲染和显示,然后在另一个线程上等待,然后更改事件派发线程上的颜色。你没有给我们main()
,你也没告诉我们实际发生了什么,所以很难说。
答案 2 :(得分:0)
您当前问题的解决方案是在if
的{{1}}块体末尾添加几行代码:
actionPerformed()
现在,您可以从构造函数中删除 stopButton.setBackground(Color.red);
paint(getGraphics());
try {
Thread.sleep(new Random().nextInt(10) * 100);
} catch (InterruptedException x) {
x.printStackTrace();
}
stopButton.setBackground(Color.green);
方法及其调用。最后,将构造函数中设置的初始颜色更改为绿色而不是红色。
注意 Thread.sleep()调用在这里是禁止的;您将需要使用waitRandom()
。这只是为了让你朝着正确的方向前进。
在此之后你还有很多东西需要弄清楚,但希望它会引起你的兴趣。
答案 3 :(得分:-1)
我认为问题在于:e.getSource() == stopButton
。您应该使用.equals()
答案 4 :(得分:-1)
试试这个兄弟:)
buttonName.setUI((ButtonUI) BasicButtonUI.createUI(buttonName));
buttonName.setBackground(Color.CYAN);