首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java GUI不变

Java GUI不变
EN

Stack Overflow用户
提问于 2012-04-27 14:07:10
回答 2查看 333关注 0票数 1

好的,我做了一个简单的反应游戏,我的代码如下。现在,当调用startGame()时,如果我注释掉while循环,一切正常,但是当我用thread.sleep(1000)运行它时,它就卡住了!整个程序都执行了,什么也没发生。请花2分钟运行代码,并帮助我调试它。我正在使用thread.sleep(1000)查看用户是否可以单击亮起的jPanelArray JPanel。但我相信因为有了thread.sleep,当开始游戏按钮被按下时,图形用户界面根本不会改变。真的很感谢你的帮助。

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JExternFrame extends JFrame implements ActionListener{
    public Color randomColor(){
        return new Color((.8f) * generator.nextFloat() + .04f,(.8f) * generator.nextFloat() + .04f,(.8f) * generator.nextFloat() + .04f);
    }
    public JPanel [][]jPanelArray;
    public JButton startButton;
    int []currentLitUp;
    public Random generator;
    public JPanel main;
    public JExternFrame(){
        super("The Reaction Game");
        generator = new Random();
        setSize(400,400);
        startButton = new JButton("Start Game");
        startButton.setOpaque(true);
        startButton.setBorderPainted(false);
        startButton.setBackground(randomColor());
        add(startButton,BorderLayout.NORTH);
        main = new JPanel();
        main.setBackground(randomColor());
        add(main);
        mouseClick myMouseClick = new mouseClick();
        startButton.addActionListener(this);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    public void startGame(){
        startButton.setVisible(false);
        int numOfClicks = generator.nextInt(8)+5;
        int sizeX = 15;
        int sizeY = 15;
        currentLitUp = new int[2];
        jPanelArray = new JPanel[sizeX][sizeY];
        mouseClick mouseClicked = new mouseClick();
        main.setLayout(new GridLayout(sizeX,sizeY));
        for(int i = 0; i < sizeX; i++){
            for(int j = 0; j < sizeY; j++){
                jPanelArray[i][j] = new JPanel();
                jPanelArray[i][j].setBackground(Color.GRAY);
                main.add(jPanelArray[i][j]);
                jPanelArray[i][j].addMouseListener(mouseClicked);
            }
        }
        while (numOfClicks != 0){   
            numOfClicks--;
            currentLitUp[0] = generator.nextInt(14);
            currentLitUp[1] = generator.nextInt(14);
            jPanelArray[currentLitUp[0]][currentLitUp[1]].setBackground(randomColor());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            jPanelArray[currentLitUp[0]][currentLitUp[1]].setBackground(Color.GRAY);
            currentLitUp[0] = -1;
            currentLitUp[1] = -1;
        }
        System.exit(0);
    }
    public class mouseClick implements MouseListener{

        @Override
        public void mouseClicked(MouseEvent e) {
            if(e.getSource() == jPanelArray[currentLitUp[0]][currentLitUp[1]]){
                System.out.print("Correct");
            }
            else System.out.print("INCORRECT");

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }

    }
    public void actionPerformed(ActionEvent e){
        if(e.getSource() == startButton){
            startGame();
        }
    }
    public static void main(String[] args){
         new JExternFrame();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-27 14:15:52

您的actionPerformed()方法由Event Dispatch Thread上的Swing调用。在您的actionPerformed()方法中,调用startGame(),此方法不断循环。这意味着你永远不会让事件调度线程继续它的工作。

你需要调查SwingWorkerSwingUtilities.invokeLater()

票数 3
EN

Stack Overflow用户

发布于 2012-04-27 14:13:02

您的Thread.sleep()在GUI线程中运行,并将其置于休眠状态,因此它不能继续处理其他图形用户界面事件。

Swing中的并发性是你的问题,你会发现这个问题被回答了很多次……

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10345591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档