Java swing应用程序不工作

Java swing应用程序不工作,java,swing,timer,triggers,actionlistener,Java,Swing,Timer,Triggers,Actionlistener,以下是我的应用程序的图像: 按下新按钮时,将显示问题并启动计时器 但按下“新建”按钮后,计时器不会运行,文本也不会显示,默认的关闭操作不起作用。当我注释掉checkTimer()时,它工作正常 代码如下: if(buttonEvent.getActionCommand().equals("New")){ String store = buttonEvent.getActionCommand(); startGame();

以下是我的应用程序的图像:

按下新按钮时,将显示问题并启动计时器

但按下“新建”按钮后,计时器不会运行,文本也不会显示,默认的关闭操作不起作用。当我注释掉checkTimer()时,它工作正常

代码如下:

if(buttonEvent.getActionCommand().equals("New")){
                String store = buttonEvent.getActionCommand();
                startGame();
                checkTimer();

            panelOne.remove(buttonNew);
            panelOne.revalidate();
            panelOne.repaint();
        }

public void startGame(){
    // TODO Auto-generated method stub
    String line = null;
    try{
        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\myPc\\Documents\\myFile.txt"));
        while((line = reader.readLine()) != null){
            System.out.println(line);
            queue.add(line);
        }
        reader.close();
    }
    catch(IOException exception){
        exception.printStackTrace();
    }
       // flag = true;
        String display = queue.remove();
        textArea.setText(display);
        //checkTimer();
} 


    public void checkTimer() {
    // TODO Auto-generated method stub

    int sec = 59;
    int min = Integer.parseInt(timerField1.getText());

    while(min >= 0){
        min--;
        if(min >= 0){
            for(int i = 0; i < 60; i++){
                try{
                    Thread.sleep(1000);
                }
                catch(InterruptedException ie){
                    Thread.currentThread().interrupt();
                }

                timerField1.setText(Integer.toString(min));
                timerField2.setText(Integer.toString(sec));
                if(sec > 0){
                    sec--;
                }
                else{
                    break;
                }
            }
        }
        //textArea1.setText(Integer.toString(num));
        sec = 59;
    }

}
if(buttonEvent.getActionCommand().equals(“New”)){
字符串存储=buttonEvent.getActionCommand();
startGame();
checkTimer();
面板一。拆除(按钮NEW);
panelOne.revalidate();
panelOne.repaint();
}
公共无效StartName(){
//TODO自动生成的方法存根
字符串行=null;
试一试{
BufferedReader=new BufferedReader(新文件阅读器(“C:\\Users\\myPc\\Documents\\myFile.txt”);
而((line=reader.readLine())!=null){
系统输出打印项次(行);
queue.add(行);
}
reader.close();
}
捕获(IOException异常){
异常。printStackTrace();
}
//flag=true;
字符串显示=queue.remove();
textArea.setText(显示);
//checkTimer();
} 
公共无效校验计时器(){
//TODO自动生成的方法存根
整数秒=59;
int min=Integer.parseInt(timerField1.getText());
而(最小值>=0){
闵--;
如果(最小值>=0){
对于(int i=0;i<60;i++){
试一试{
睡眠(1000);
}
捕获(中断异常ie){
Thread.currentThread().interrupt();
}
timerField1.setText(Integer.toString(min));
timerField2.setText(整数.toString(秒));
如果(秒>0){
第二节;
}
否则{
打破
}
}
}
//textArea1.setText(Integer.toString(num));
秒=59;
}
}
请告诉我为什么它不起作用

通过调用sleep()来阻止checkTimer()。事实上,它阻止重新绘制UI和处理所有事件

相反,启动一个新的独立线程并调用UI更改,例如

            timerField1.setText(Integer.toString(min));
            timerField2.setText(Integer.toString(sec));
在SwingUtilities.invokeAndWait()块内部(也可以尝试invokeLater())

通过调用sleep()在checkTimer()中阻塞。事实上,它阻止重新绘制UI和处理所有事件

相反,启动一个新的独立线程并调用UI更改,例如

            timerField1.setText(Integer.toString(min));
            timerField2.setText(Integer.toString(sec));

在SwingUtilities.invokeAndWait()块内部(也可以尝试invokeLater())

您的问题是您检查计时器()它不是一个线程,然后如果您再次按下“新建”按钮,此调用将检查计时器(),但另一个实例仍在运行。您需要为时钟使用Swing Timer,然后当您按下New按钮时可以停止它。

您的问题是checkTimer()不是线程,如果您再次按下New按钮,则调用checkTimer(),但另一个实例仍在运行。你们需要为你们的时钟使用摆动计时器,然后当你们按下新的按钮时,你们可以停止它

Thread.sleep(1000);
事件调度线程(EDT)
上执行代码时,不要使用ad.sleep。这将导致GUI冻结并阻止GUI响应事件

按下新按钮时,将显示问题并启动计时器

然后,您应该使用
摆动计时器
。您可以将计时器设置为每秒启动一次,以便更新时间。然后,如果触发300次,你就会停止计时器,游戏就结束了

有关更多信息和工作示例,请阅读上Swing教程的部分

事件调度线程(EDT)
上执行代码时,不要使用ad.sleep。这将导致GUI冻结并阻止GUI响应事件

按下新按钮时,将显示问题并启动计时器

然后,您应该使用
摆动计时器
。您可以将计时器设置为每秒启动一次,以便更新时间。然后,如果触发300次,你就会停止计时器,游戏就结束了


阅读上Swing教程中的部分,了解更多信息和工作示例。

查看教程应用程序应该做什么?你为什么使用线程?你读过如何使用线程吗?哪些线程负责应用程序的哪些部分?检查教程应用程序应该做什么?你为什么使用线程?你读过如何使用线程吗?哪些线程负责应用程序的哪些部分?(1-)不要扩展线程来创建自己的“计时器”。所有Swing组件都应该从EDT更新(如并发教程中所述)。相反,您应该使用一个摆动计时器。Swing教程还有一个关于“如何使用Swing计时器”的部分。你说得对!!,我忘了这个。使用Swing定时器比线程简单。(1-)不要扩展线程来创建自己的“定时器”。所有Swing组件都应该从EDT更新(如并发教程中所述)。相反,您应该使用一个摆动计时器。Swing教程还有一个关于“如何使用Swing计时器”的部分。你说得对!!,我忘了这个。使用Swing timer比使用thread更简单。嘿,感谢您的回复,我尝试创建一个单独的线程,但eclipse给出了创建静态线程的错误消息,我无法理解java Swing timer,所以这就是问题所在:(嘿,感谢您的回复,我尝试创建一个单独的线程,但eclipse给出了创建静态线程的错误消息,我无法理解java swing计时器,所以这就是问题所在:(我读了那一节,但我不清楚如何使用它们。@user007,一个简单的例子让你开始:。你也可以在论坛上搜索其他的例子。我猜不出你不明白什么。我读了那一节,但我无法得到c。)