开发者社区> 问答> 正文

paintImmediately()函数没有效果? 400 报错

paintImmediately()函数没有效果? 400 报错

@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都是等主程序完成才更新,为什么呢

展开
收起
爱吃鱼的程序员 2020-06-05 12:03:35 485 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB


    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 就可以了(不知道你为什么要写这两个方法)

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

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载