java JLayeredPane未使用JFrame调整大小
我在一个JFrame
中有一个JLayeredPane
,其中有两个JPanel
。这一切都很好,除了因为JLayeredPane
需要我有一个空的Layout
,当JFrame
调整大小时,它不能正确地调整两个JPanel
的大小
public class CreatorUI extends JFrame{
private static final long serialVersionUID = 1L;
private JPanel moveablePane = new JPanel();
private Container backgroundPane;
private JLayeredPane layers = new JLayeredPane();
private ComponentMover componentMover = new ComponentMover();
private ComponentResizer componentResizer = new ComponentResizer();
public CreatorUI(){
backgroundPane = new BackgroundUI().initComponents();
layers.add(backgroundPane, 1);
moveablePane.setLayout(null);
componentMover.setAutoLayout(true);
moveablePane.setOpaque(false);
layers.add(moveablePane, 2);
moveablePane.setSize(backgroundPane.getSize());
add(layers, BorderLayout.CENTER);
layers.setPreferredSize(backgroundPane.getPreferredSize());
pack();
}
public void addWindow(WindowComponent window){
this.componentMover.registerComponent(window);
this.componentResizer.registerComponent(window);
this.componentMover.setDragInsets(this.componentResizer.getDragInsets());
this.moveablePane.add(window);
}
public static void main(String[] args){
CreatorUI frame = new CreatorUI();
frame.addWindow(new MapComponent());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这是它通常的外观(看起来非常适合正常尺寸):
这就是我尝试调整JFrame
大小后的样子:
我发现,如果我将代码更改为以下内容,可以调整顶层的大小:
public CreatorUI(){
componentMover.setAutoLayout(true);
backgroundPane = new BackgroundUI().initComponents();
moveablePane.setLayout(null);
moveablePane.setOpaque(false);
moveablePane.setSize(backgroundPane.getSize());
layers.setLayout(new BorderLayout());
layers.add(backgroundPane, BorderLayout.CENTER);
layers.setLayer(backgroundPane, new Integer(1));
layers.add(moveablePane, BorderLayout.CENTER);
layers.setLayer(moveablePane, new Integer(2));
add(layers, BorderLayout.CENTER);
layers.setPreferredSize(backgroundPane.getPreferredSize());
pack();
}
这就是它现在的样子(只有粉红色层会调整大小):
# 1 楼答案
对于上面有阴影层的更复杂的容器,我也有同样的问题。我在寻找答案,但只找到了这个(这对我没有帮助)。我所做的是:
有关repaint/revalidate的更多信息
# 2 楼答案
回答我自己的问题
有一个非常hack-y的修复,它(出于您的目的)是使覆盖始终保持最大大小