JButton的颜色不会改变

时间:2014-12-11 02:10:42

标签: 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;
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);

    }

}

5 个答案:

答案 0 :(得分:1)

问题是,什么“看起来”像按钮背景,不是。如果你添加

,它就是“内容”按钮
    stopButton.setContentAreaFilled(false);

waitRandom方法,您会看到......

enter image description here

答案 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);