从线程调用时,Java GUI 不会被修改/更新

RSal

我有一个项目,我必须使用 Java Swing创建一个轮盘赌当轮子“旋转”时,轮子上的数字会随机突出显示,然后再落在最终数字上。

我必须创建一个 GUI 类,它在上述布局中提供 JLabels。在这个 GUI 类中也需要旋转轮子的方法,我们必须明确地使用一个线程和 Runnable 接口来处理这个。

在添加 GUI 类 (RouletteWheel) 之前,教授为我提供了一个驱动程序类,它创建了一个 JFrame 和按钮:

public WheelTest()
{
    theWindow = new JFrame("WheelTest Program");
    theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    ActionListener listen = new ButtonListener();

    setButton = new JButton("Set Wheel");  
    setButton.setFont(myFont);
    setButton.addActionListener(listen);

    ........

    theWheel = new RouletteWheel();   //GUI class
    theWindow.add(theWheel, BorderLayout.CENTER);
}

这是我的 GUI 类的样子:

final RouletteSquare [] squareArray = new RouletteSquare[37];  //Array of JLabels
private Boolean spun;

public RouletteWheel(){
    createGUI();
}

private void createGUI(){  //Creates a RouletteSquare object for each place in the array
    this.setLayout(new GridLayout(6, 6));
    for(int i = 0; i <= 36; i++){
        squareArray[i] = new RouletteSquare(i);
        this.add(squareArray[i]);
        squareArray[i].choose();
    }
}

public void spin(){
    Runnable wheel = new RouletteWheel();
    new Thread(wheel).start();
}

public void run(){
    Random rand = new Random();
    long startTime = System.nanoTime();
    long endTime = System.nanoTime();
    long elapsedTime = endTime - startTime;
    long nanoTime = 10000;
    while(elapsedTime <= nanoTime)
    {
        i = rand.nextInt(37);
        System.out.println("i = " + i);
        squareArray[i].choose();  //Highlights square CYAN color
        try {Thread.sleep(500);}  //Adds a delay between selections
        catch (InterruptedException e){}
        squareArray[i].unChoose();  //Un-highlights square
        endTime = System.nanoTime();
        elapsedTime = endTime - startTime;
    }
    i = rand.nextInt(37);
    squareArray[i].choose();
}

作为记录,这个 GUI 类利用了之前名为 RouletteSquare 的项目中的另一个类,它只是创建一个单独的 JLabel 并提供突出显示该 JLabel 的方法。我使用一组 RouletteSquares 来创建 RouletteWheel(这也是该项目所必需的)。下面是 RouletteSquare 类的样子:

private boolean cvar;
private int value;
public RouletteSquare(int val)
{
    value = val;
    this.setLayout(new GridLayout(1, 1));

    number2 = new JLabel();
    number2.setText(String.valueOf(value));
    number2.setFont(new Font("Serif", Font.BOLD, 50));
    number2.setForeground(getColorType(getColor()));
    number2.setHorizontalAlignment(CENTER);
    number2.setOpaque(true);
    number2.setBackground(Color.WHITE);

    this.setPreferredSize(new Dimension(75, 75));
    this.add(number2);
}

public boolean isChosen() {
    return cVar;
}

public void unChoose() {
    cVar = false;
    number2.setBackground(Color.WHITE);
}

public void choose() {
    cVar = true;
    number2.setBackground(Color.CYAN);
}

GUI 已正确创建和初始化,我可以在线程方法调用之外对其进行更改。

我遇到的问题是,据我通过打印语句判断,我的代码可以正确执行,但是通过线程调用时 GUI 不会更新。我曾尝试使用 SwingUtilities.InvokeLater(Runnable),但这未能成功解决我的问题。我也不能使用 javax.swing.timer,因为我必须使用线程。

我的想法快用完了,我开始变得非常沮丧。任何帮助将不胜感激,谢谢!

卡米克

您创建 RouletteWheel 类:

theWheel = new RouletteWheel();  

但随后在您的 spin() 方法中,您创建了 RouletteWheel 的另一个实例:

public void spin(){
    Runnable wheel = new RouletteWheel();
    new Thread(wheel).start();
}

您只需要 RouletteWheel 类的一个实例。

我猜代码应该是:

//new Thread(wheel).start();
new Thread(this).start();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章