等待线程时,它不显示应显示的图标

时间:2014-05-04 18:49:54

标签: java multithreading swing synchronized

我正在尝试创建一个记忆游戏。当第一个和第二个按钮都有相同的图像时,我将它们的图像设置为null。还要关联一个值(即图像)我创建了类UsingJButton扩展JButton

public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub
    if (e.getButton() == MouseEvent.BUTTON1) {
        if (game.timePassed == 0) {
            game.clock.start();
        }
        game.openButton(this);
        game.checkIfWon();
    }
}

这段代码在另一个类中调用openButton()方法。

public void openButton(UsingJButton b) {
        // TODO Auto-generated method stub

    if (b.isEnabled() && !button1) {
        b.setIcon(new ImageIcon(upperImages[b.value].getImage().getScaledInstance(50, 50,
                java.awt.Image.SCALE_SMOOTH)));
        b1 = new UsingJButton(b.row, b.col, this);
        b1 = b;
        button1 = true;
    } else if (b.isEnabled() && button1 && !button2 && ((b1.row != b.row) || (b1.col != b.col))) {
        synchronized (b) {
            b.setIcon(new ImageIcon(upperImages[b.value].getImage().getScaledInstance(50, 50,
                    java.awt.Image.SCALE_SMOOTH)));
            button2 = true;
            try {
                b.wait(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    if (button1 && button2) {
        if (b1.value == b.value) {
            b1.setVisible(false);
            b.setVisible(false);
            flagCount += 1;
            paint();
            repaint();
        } else {
            b1.setIcon(null);
            b.setIcon(null);
        }
        button1 = button2 = false;
    }

}

我关注的原因是,在这个片段中,

synchronized (b) {
    b.setIcon(new ImageIcon(upperImages[b.value].getImage().getScaledInstance(50, 50,
            java.awt.Image.SCALE_SMOOTH)));
    button2 = true;
    try {
        b.wait(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

当我获得按钮b上的锁定时,它会等待2秒,但不会显示按钮上的图标。我已在此类中声明了我的ImageIcon[]数组(在定义openButton()的类中),而我的按钮属于UsingJButtons类。 按钮上的图标应显示为游戏的重要部分。

0 个答案:

没有答案