paintImmediately()函数没有效果

笨的真可以 发布于 2015/05/29 15:06
阅读 464
收藏 0

@Kooosy 你好,想跟你请教个问题:

public class Test extends JFrame {
JPanel panel = new JPanel();
int i = 0;

JButton button = new JButton("da");
    JTextField field1 = new JTextField("aaaa");
    JTextField field2 = new JTextField("bbbb");
    JTextField field3 = new JTextField("cccc");
    public Test(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 200, 400);
button.addActionListener(new ac());
panel.setLayout(new GridLayout(3, 1));
panel.add(field1);
panel.add(field2);
panel.add(field3);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(button,BorderLayout.EAST);
getContentPane().add(panel,BorderLayout.WEST);
    }
    
    public class ac implements ActionListener{


@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
updata();
}
   
    }
    
    public static void main(String[] args){
    Test test = new Test();
    test.setVisible(true);
   
    }
    
    public void updata(){
    try {
    field1.setText(i+1+"");
    field1.paintImmediately(field1.getBounds());
    Thread.sleep(2000);
   
    field2.setText(i+2+"");
    field2.paintImmediately(field2.getBounds());
    Thread.sleep(2000);
   
    field3.setText(i+3+"");
    field3.paintImmediately(field3.getBounds());
    Thread.sleep(2000);
   
    i = i+1;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   
    System.out.println("hello");
    }
}


例如这个程序,只有field1会立刻更新,field2、field3都是等主程序完成才更新,为什么呢

加载中
0
Kooosy
Kooosy


1. 对UI的操作必须在UI线程中  main方法 里面改为

SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
                test.setVisible(true);
            }
        });
2. update 方法里面的 

field1.paintImmediately(field1.getBounds());
    Thread.sleep(2000);



没有意义   直接设置 setText 就可以了(不知道你为什么要写这两个方法)

Kooosy
Kooosy
回复 @笨的真可以 : 我猜你的意思是不在里面 Thread.sleep 程序会直接结束掉? Swing程序会启动其他线程 程序是不会结束的
Kooosy
Kooosy
回复 @笨的真可以 : 我没提到阻塞 是之前你找我的时候 我就和你说过了 另外 不要再UI线程调用耗时任务
Kooosy
Kooosy
回复 @笨的真可以 : setText 立即就改变 文本了 你这个事件是点击按钮触发的 什么叫做主进程还没结束前 更新UI UI不需要你去主动更新 设置对应的值(实质是改变了Model的值然后UI监听到对应的改变 自己去刷新自己) 他自己会刷新
笨的真可以
笨的真可以
我找到答案了,是我把UI线程给阻塞了,应该新建线程执行,在新建线程中阻塞
笨的真可以
笨的真可以
我是想主进程还没有结束前就更新UI,你这样做我试了还是不能立即更新啊,我之所以setText后面加field1.paintImmediately()就是为了立即更新的目的
返回顶部
顶部