在JAVA中等待进程完成时,按钮未显示在帧上

在JAVA中等待进程完成时,按钮未显示在帧上,java,swing,processbuilder,Java,Swing,Processbuilder,//框架可见,但其上的按钮不显示。ProcessBuilder执行a.sh,我们需要等待此过程完成。调用showFrame()显示不带按钮和标签的框架,但在流程完成后,整个框架将变为可见 showFrame(); Process test=null; try { test = new ProcessBuilder("sh" ,"config/a.sh").start();

//框架可见,但其上的按钮不显示。ProcessBuilder执行a.sh,我们需要等待此过程完成。调用showFrame()显示不带按钮和标签的框架,但在流程完成后,整个框架将变为可见

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

Swing是单线程的,这意味着任何阻止EDT的操作都会阻止它处理事件队列中的新事件,它也不是线程安全的,这意味着您永远不应该从EDT之外的任何其他线程更新或修改UI

有关更多详细信息,请参阅

一个解决方案是允许
进程
在它自己的
线程
中执行,并使用某种方法来获得
进程的结果

比如说,比如说,甚至是比如


避免使用
null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,放弃这些管理器将导致无休止的问题,您将花费越来越多的时间试图纠正这些问题

您不需要为按钮、标签设置visible true,默认情况下它们是可见的