有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
    }

}

这是它通常的外观(看起来非常适合正常尺寸): normal

这就是我尝试调整JFrame大小后的样子: resized

我发现,如果我将代码更改为以下内容,可以调整顶层的大小:

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();
}

这就是它现在的样子(只有粉红色层会调整大小): changed


共 (2) 个答案

  1. # 1 楼答案

    对于上面有阴影层的更复杂的容器,我也有同样的问题。我在寻找答案,但只找到了这个(这对我没有帮助)。我所做的是:

    layers.addComponentListener(new ComponentAdapter() {
        @Override public void componentResized(ComponentEvent e) {
            Dimension size = layers.getSize(); // get size
            backgroundPane.setSize(size); // push size through
            moveablePane.setSize(size); // push size trhough
    //      otherChildOfLayers.setSize(size); // push size trhough
            layers.revalidate(); // revalidate to see updates
            layers.repaint(); // "Always invoke repaint after revalidate"
        }
    });
    

    有关repaint/revalidate的更多信息

  2. # 2 楼答案

    回答我自己的问题

    有一个非常hack-y的修复,它(出于您的目的)是使覆盖始终保持最大大小

    public CreatorUI(){
    
        componentMover.setAutoLayout(true);
    
        backgroundPane = new BackgroundUI().initComponents();
        moveablePane.setLayout(null);
        moveablePane.setOpaque(false);
        moveablePane.setSize(Toolkit.getDefaultToolkit().getScreenSize());
    
        layers.setLayout(new BorderLayout());
    
    
        layers.setLayer(moveablePane, JLayeredPane.DRAG_LAYER);
        layers.add(moveablePane, BorderLayout.CENTER);
    
        layers.setLayer(backgroundPane, JLayeredPane.DEFAULT_LAYER);
        layers.add(backgroundPane, BorderLayout.CENTER);
    
    
        add(layers, BorderLayout.CENTER);
        layers.setPreferredSize(backgroundPane.getPreferredSize());
    
        pack();
    }