Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JButton颜色不会改变_Java_Swing_Jbutton - Fatal编程技术网

Java JButton颜色不会改变

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;

我正在制作一个反应时间游戏,其中一个按钮将变为绿色,你必须尽可能快地点击它,但按钮不会改变颜色。有人能告诉我为什么会这样吗?还有,我怎样才能让我的程序等到随机时间方法出现在下面,然后再改变颜色呢?我尝试使用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);

    }

}

我认为问题在于: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);