我这个程序就是  有一个按钮,按下后傍边的时间就会开始动。。
编译能通过, 但是我按下按钮的时候  程序就死了。
帮我解决下100.import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class E2 extends JFrame {
JLabel labels;
JButton b;
public E2(){
JPanel p=new JPanel();

labels=new JLabel("00:00");
b=new JButton();
p.add(labels);p.add(b);
getContentPane().add(p);
b.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e1){
         int i=0;
int I=0;
int m=0;
int M=0;
while(true)
 { i++;
  try{Thread.sleep(1000);}
  catch(InterruptedException e){}
  if(i==10)
  {
  I+=1;i=0;
  }
  if(I==6)
  {
  m+=1;I=0;
  }
  if(m==10)
  {
  M+=1;m=0;
  }
  labels.setText(String.valueOf(M)+String.valueOf(m)+":"+String.valueOf(I)+String.valueOf(i));


}
           }});
           setVisible(true);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 pack();
}
public static void main(String args[]){new E2();}}

解决方案 »

  1.   

    b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e1) {
    int i = 0;
    int I = 0;
    int m = 0;
    int M = 0;
    while (true) {
    i++;
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    }

    if (i == 10) {
    I += 1;
    i = 0;
    }
    if (I == 6) {
    m += 1;
    I = 0;
    }
    if (m == 10) {
    M += 1;
    m = 0;
    }
    labels.setText(String.valueOf(M) + String.valueOf(m) + ":"
    + String.valueOf(I) + String.valueOf(i));
    labels.repaint();
    }
    }
    });因为按下按钮后, 程序在while循环中不会出来, 所以按关闭按钮没反应, 可以把这个while循环放到一个线程中去处理.
      

  2.   

    无聊之余, 又改了一下你的代码, 在按钮的事件处理中加了一个线程, 这样就可以了, 但是要注意那个线程的问题(按下两次或多次按钮就可以发现了), 你自己可以思考一下.import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;public class Test01 extends JFrame {
    JLabel labels;
    JButton b; public Test01() {
    JPanel p = new JPanel(); labels = new JLabel("00:00");
    b = new JButton();
    p.add(labels);
    p.add(b);
    getContentPane().add(p);
    b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e1) {
    Thread thread = new Thread() { public void run() {
    int i = 0;
    int I = 0;
    int m = 0;
    int M = 0;
    while (true) {
    i++;
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    } if (i == 10) {
    I += 1;
    i = 0;
    }
    if (I == 6) {
    m += 1;
    I = 0;
    }
    if (m == 10) {
    M += 1;
    m = 0;
    }
    labels.setText(String.valueOf(M)
    + String.valueOf(m) + ":"
    + String.valueOf(I) + String.valueOf(i));
    labels.repaint();
    }
    }
    };

    thread.start();
    } }); setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack(); } public static void main(String args[]) {
    new Test01();
    }}
      

  3.   

    有时需要从事件派发线程以外的线程中更新Swing组件,例如,在actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要很长时间才能看到更新的列表,按钮会长时间保持按下的状态直到actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件派发线程去派发其他的事件。
       SwingUtilities类提供了两个方法:invokeLater和invoteAndWait,它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。