//框架可见但其上的按钮未显示。 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);
答案 0 :(得分:0)
test.waitFor();
是一个阻塞调用,如果在事件调度线程的上下文中执行,这将阻止UI更新,因为它无法处理事件队列上的事件
Swing是单线程的,这意味着阻止EDT的任何东西都会阻止它处理来自事件队列的新事件,它也不是线程安全的,这意味着你永远不应该从其他任何线程更新或修改UI。美国东部时间
有关详细信息,请参阅Concurrency in Swing。
解决方案是允许Process
在其Thread
内执行并使用某种Observer Pattern来获取Process
<的结果/ p>
避免使用null
布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正