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