Java JButton颜色不会改变
我正在制作一个反应时间游戏,其中一个按钮将变为绿色,你必须尽可能快地点击它,但按钮不会改变颜色。有人能告诉我为什么会这样吗?还有,我怎样才能让我的程序等到随机时间方法出现在下面,然后再改变颜色呢?我尝试使用Thread.sleep,但无法使其正常工作Java JButton颜色不会改变,java,swing,jbutton,Java,Swing,Jbutton,我正在制作一个反应时间游戏,其中一个按钮将变为绿色,你必须尽可能快地点击它,但按钮不会改变颜色。有人能告诉我为什么会这样吗?还有,我怎样才能让我的程序等到随机时间方法出现在下面,然后再改变颜色呢?我尝试使用Thread.sleep,但无法使其正常工作 mport java.awt.Color; import java.util.Random; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font;
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);
}
}
我认为问题在于:e.getSource==stopButton。您应该使用.equals来完成构造函数中的所有UI设置,这既不可靠又容易出错,但我想真正的问题是您不允许UI在事件调度线程上设置、呈现和显示,然后等待另一个线程,然后在事件调度线程上更改颜色。你没有给我们主要信息,也没有告诉我们实际发生了什么,所以很难说。问题是,看起来像按钮背景的东西不是。这是按钮内容,如果您添加
stopButton.setContentAreaFilled(false);
对于waitRandom方法,您将看到
解决眼前问题的方法是在actionPerformed中的if块体末尾添加几行代码: 现在可以从构造函数中删除waitRandom方法及其调用。最后,将构造函数中设置的初始颜色更改为绿色而不是红色 注意这里的Thread.sleep调用是no;您将希望改用javax.swing.Timer。这只是为了让你走上正确的方向
在这之后,还有很多问题需要你去解决,但希望它能帮你解决。println语句运行吗?我在这里没有看到任何等待代码。@是的,我只是在那里确认这个数字确实是随机的。我在Thread.sleep方法中使用了它,以便在您必须随机单击按钮时腾出时间。@immibis Thread.sleep方法被删除,因为它刚刚停止了程序的启动。@AlecR请看javax.swing.Timer。问题是为什么按钮不会改变颜色;虽然您在按钮的事件处理程序中发现了一个错误,但它很可能与问题中的错误无关。我应该在哪里进行UI设置?在我养成习惯之前,我想纠正我现在所做的任何糟糕的编程实践。此外,主要方法只是调用一个新游戏,任何UI更改都需要在事件调度线程EDT中进行;SwingUtilities.invokeNow和.invokeLater方法非常有用。您可以尝试在invokeNow中调用新游戏,然后等待随机时间,然后使用invokeNow更改按钮的颜色。您的主方法不在EDT上,invokeNow将为您获取代码并在EDT上执行。到目前为止,我还没有学习任何关于线程的知识,我在哪里可以读懂它们,这样你的答案对我来说就更有意义了?任何基本的Swing教程都会讨论进行UI更改的重要性,比如更改EDT线程上按钮的颜色。我不会太担心研究线程本身,只是为了让这个程序运行。invokeAndWait抱歉,在方法获取可运行对象并在EDT线程上执行该对象中的run方法之前,我的名称搞错了。有很多关于为此目的创建这样一个可运行对象的示例。找到一个基本的Swing教程并学习如何做到这一点。我独自尝试了他的代码,它是绿色的。问题是什么请解释。我添加了序列号,这就是它,它可以工作fine@SolomonPByer根据您使用的外观,Swing可能会忽略按钮的背景色属性,并以其认为合适的方式对其内容进行蒙皮,这意味着按钮看起来不会改变颜色。试着使用系统的外观和感觉像Windows
stopButton.setBackground(Color.red);
paint(getGraphics());
try {
Thread.sleep(new Random().nextInt(10) * 100);
} catch (InterruptedException x) {
x.printStackTrace();
}
stopButton.setBackground(Color.green);