我正在使用BoxLayout并动态删除组件,如下所示:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
final JLabel l = new JLabel("remove");
frame.add(l);
frame.add(new JLabel("Hello2"));
frame.add(new JLabel("Hello3"));
frame.pack();
frame.setVisible(true);
new Thread() {
public void run() {
Utils.sleep(1000);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(l);
frame.repaint();
}
});
}
}.start();
}
});
}
但是,这样做时,即使从布局中删除了有问题的标签,其他组件也不会向上移动以覆盖其空间,直到我调整框架大小。我在移除组件后尝试重新绘制框架,但没有运气 - 标签不再显示,但仍然存在以前的差距。
除了每次移除组件时自动调整窗口大小的明显可怕的躲避,我如何获得所需的行为?
答案 0 :(得分:4)
您还需要在frame
上调用validate()
。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(l);
frame.validate();
frame.repaint();
}
});
答案 1 :(得分:4)
1 / put revalidate()
;在repaint()
之前;
2 /更好会从Thread
调用Runnable
而不是invokeLater()