Java Swing добавляет JPanel в JLayeredpane, чтобы Jframe динамически менял размер

Я пытаюсь заставить свой JFrame и содержимое внутри него автоматически изменять размер и положение при изменении размера окна и т. д. Мне удалось сделать это успешно при использовании JPanel внутри JFrame, однако, когда я добавляю JLayeredPane между ними эти два перестают работать.

Код для рабочих JPanel и JFrame приведен ниже, когда размер экрана изменяется, панели динамически меняют размер и положение на экране.

JFrame UIFrame = new JFrame("Project");
UIFrame.setSize(1100, 768);
UIFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
BorderLayout mainPanelLayout = new BorderLayout();
mainPanel.setLayout(mainPanelLayout);
Footer UIFooter = new Footer(); // Creates the footer
mainPanel.add("South", UIFooter.getPanel()); 
addTabs(); // Adds all the tabs to the screen
mainPanel.add("Center", Pane); 
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
UIFrame.setLocation(dim.width/2-UIFrame.getSize().width/2, dim.height/2-UIFrame.getSize().height/2);
UIFrame.setContentPane(mainPanel); // Content placed on the frame
UIFrame.setVisible(true); // Frame set to visible

Однако, когда я добавляю свой JLayeredPane, размер экрана больше не изменяется динамически. Я думаю, что это связано с методом setBounds, однако без этого метода на экране ничего не отображается.

JFrame UIFrame = new JFrame("Project");
UIFrame.setSize(1100, 768);
UIFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
BorderLayout mainPanelLayout = new BorderLayout();
mainPanel.setLayout(mainPanelLayout);
Footer UIFooter = new Footer(); 
mainPanel.add("South", UIFooter.getPanel()); 
addTabs();
mainPanel.add("Center", Pane); 
mainPanel.setBounds(0, 0, 1085, 725);
JLayeredPane desktop = new JDesktopPane();
desktop.setOpaque(false);
desktop.add(mainPanel, JLayeredPane.DEFAULT_LAYER);
UIFrame.add(desktop);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
UIFrame.setLocation(dim.width/2-UIFrame.getSize().width/2, dim.height/2-UIFrame.getSize().height/2);
UIFrame.setContentPane(desktop); // Content placed on the frame
UIFrame.setVisible(true); // Frame set to visible

person user2013520    schedule 31.07.2014    source источник


Ответы (1)


Я считаю, что когда вы используете setBounds, вы постоянно фиксируете эту панель до этого размера, поэтому динамического изменения размера не будет.

Лично я чаще всего использую GridBagLayout, возможно, вы могли бы попробовать это? Настройки в ограничениях gridbag, которые важны для вас, будут «fill», «weightx» и «weighty».

По сути, этот фрагмент кода должен помещать JLayeredPane в уже созданный JFrame и JPanel в JLayeredPane, и все они будут изменять размер вместе с фреймом:

JLayeredPane jLayeredPane1 = new JLayeredPane();
JPanel jPanel1 = new JPanel();
GridBagConstraints gBC = new GridBagConstraints();

getContentPane().setLayout(new GridBagLayout());
jLayeredPanel1.setLayout(new GridBagLayout());

gBC.fill = GridBagConstraints.BOTH;
gBC.weightx = 1.0;
gBC.weighty = 1.0;

getContentPane().add(jLayeredPane1, gBC);
jLayeredPane1().add(jPanel1, gBC);
person mbw    schedule 31.07.2014