在等待在JAVA中完成进程时,按钮不会显示在Frame上

时间:2015-04-09 06:57:08

标签: java swing processbuilder

//框架可见但其上的按钮未显示。 ProcessBuilder执行a.sh,我们需要等待这个过程的完成。调用showFrame()会显示没有按钮和标签的框架,但只要Process完成,框架就会变为可见。

    showFrame();
            Process test=null;
            try {
                test = new ProcessBuilder("sh" ,"config/a.sh").start(); 

                test.waitFor();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
   }
        private void showFrame() {
            JFrame fr = new JFrame("Operations");
            fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            fr.setBounds(100,100,600,500);
            fr.setSize(500, 500);
            JButton b1 = new JButton("PORT30");
            JLabel l1 = new JLabel("TRACKER");
            l1.setBounds(100,70,100,100);
            fr.setLayout(null);
            JLabel l2 = new JLabel("NODE");
            l2.setBounds(100,170,100,100);
            b1.setBounds(300,100,160,50);
            JButton b2 = new JButton("PORT70");
            b2.setBounds(300,200,160,50);
            fr.add(b1);
            fr.add(b2);
            fr.add(l2);
            fr.add(l1);
            fr.setVisible(true);
            l1.setVisible(true);
            l2.setVisible(true);
            b1.setVisible(true);
            b2.setVisible(true);

1 个答案:

答案 0 :(得分:0)

test.waitFor();是一个阻塞调用,如果在事件调度线程的上下文中执行,这将阻止UI更新,因为它无法处理事件队列上的事件

Swing是单线程的,这意味着阻止EDT的任何东西都会阻止它处理来自事件队列的新事件,它也不是线程安全的,这意味着你永远不应该从其他任何线程更新或修改UI。美国东部时间

有关详细信息,请参阅Concurrency in Swing

解决方案是允许Process在其Thread内执行并使用某种Observer Pattern来获取Process <的结果/ p>

例如this或类似this之类的内容。

避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正