下面写了4个按钮,点击start前3个按钮背景色变换import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.importent.AA;public class ex1 implements ActionListener
{
private JFrame frame;
private JPanel pan;
private JButton jb1=new JButton("1");
private JButton jb2=new JButton("2");
private JButton jb3=new JButton("3");
private JButton start=new JButton("Start");
private JButton[] jb={jb1,jb2,jb3};

private int i=0;
public static void main(String[] args) 
{
new ex1().in();
}

public void in()
{
frame=new JFrame();
pan=new JPanel();
pan.setLayout(null);

jb1.setBounds(20, 50, 50, 50);
jb1.setBackground(Color.blue);
pan.add(jb1);

jb2.setBounds(70, 50, 50, 50);
jb2.setBackground(Color.blue);
pan.add(jb2);

jb3.setBounds(120, 50, 50, 50);
jb3.setBackground(Color.blue);
pan.add(jb3);


start.setBounds(300, 50, 80, 50);
pan.add(start);
start.addActionListener(this);

frame.add(pan);
frame.setSize(650, 660);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((screenSize.width - frame.getWidth())/2, 
  (screenSize.height - frame.getHeight())/2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

}

public void actionPerformed(ActionEvent e) {
if(e.getSource()==start)///*.........
{
for(int i=0;i<jb.length;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
jb[i].setBackground(Color.black);//背景色变黑
if(i>0)
jb[i-1].setBackground(Color.blue);//上一个背景色还原
}
}//.........*/

}
}
程序运行时,点start,只显示最后结果,即第3个按钮变成黑色,看不到3个按钮色彩变换的过程,但是我把/*...*/的内容放到另一个线程类中,调用这个线程就能看到过程,我想问为什么在单线程的状态下看不到过程

解决方案 »

  1.   

    关键是你的Thread。sleep(100)---------这个时间是0.1秒,你能看到变化么?        调成1000毫秒试试呢
      

  2.   

    ....http://blog.csdn.net/bzwm/archive/2009/02/16/3895381.aspx.
    对swing里的线程不太懂
      

  3.   

    swing的UI线程本身是单线程的,你把变换色彩的代码放在原来的地方的时候,执行到这里的时候UI线程会阻塞,等这部分全部执行完,swing才会重绘一次界面,因此看不到过程.
    把这部分代码放到其他线程之后,UI线程没有被阻塞,自然可以每次收到一次新号就重绘一次界面.