2016-08-06 23 views
2

Я работаю над графическим интерфейсом Swing с помощью JLayeredPane. У JFrame есть JLayeredPane, который содержит два JPanel s. Позже я хочу отобразить некоторые компоненты в JPanel, я отрезал эту часть кода, чтобы сделать ее короче для вас.Изменение размера JFrame на JPanels внутри JLayeredPane

Как изменить размер JFrame на размеры JPanel? frame.pack() не работает, и без настройки линии предпочтительный размер GUI будет отображаться с минимальным размером.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 

import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class TestGUI { 
    private JFrame frame; 
    private JLayeredPane layeredPane; 
    private JPanel panelBottom; 
    private JPanel panelTop; 
    private MainMenuBar menuBar; 

    public TestGUI() { 
     // panel bottom: 
     panelBottom = new JPanel(); 
     panelBottom.setSize(1000, 500); 
     panelBottom.setBackground(new Color(0, 100, 0, 100)); 
     panelBottom.setLayout(new GridBagLayout()); 
     // panel top: 
     panelTop = new JPanel(); 
     panelTop.setSize(950, 450); 
     panelTop.setBackground(new Color(0, 0, 100, 100)); 
     panelTop.setLayout(new GridBagLayout()); 
     // layered pane: 
     layeredPane = new JLayeredPane(); 
     layeredPane.add(panelBottom, 1); 
     layeredPane.add(panelTop, 0); 
     // frame building: 
     frame = new JFrame(); 
     menuBar = new MainMenuBar(); 
     frame.setJMenuBar(menuBar); 
     frame.setLayout(new BorderLayout()); 
     frame.setPreferredSize(new Dimension(1100, 600)); // <-- Without this the GUI will be very small 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(layeredPane, BorderLayout.CENTER); 
     frame.pack(); // <-- does not work! 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestGUI(); 
    } 
} 

EDIT: Я мог бы просто изменить предпочтительную линию размера, чтобы соответствовать большим JPanel, но я задаю вопрос, потому что я хочу, чтобы изменить размер JFrame в зависимости от размера JPanel s динамически.

ответ

3

Как было предложено в How to Use Layered Panes: Laying Out Components in a Layered Pane: «Хотя слоистая панель по умолчанию не имеет менеджера компоновки, вы все равно можете назначить диспетчер компоновки на многоуровневую панель». Используйте OverlayLayout, см. here, для перекрывающихся панелей.

В качестве альтернативы, используйте JInternalFrame, который делает позволит вам pack() внутренние кадры по отдельности, как показано here и here.

+2

Спасибо за помощь! Использование OverlayLayout сработало! – ConveniencePatterns