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