Java Swing JFrame минимизирует / максимизирует ошибку изменения размера

Проблема в том, что когда я пытаюсь максимизировать JFrame, кадр максимизируется, но размер содержимого сохраняется.

http://i.imgur.com/7q5Yh9F.png

Мой основной класс фрейма:

private CardLayout layout;

private SettingsFrame settingsFrame;

private Container contentPane;
Frame frame = this;

private ApplicationFrame() {       
    contentPane = getContentPane();
    layout = new CardLayout();
    contentPane.setLayout(layout);
    initializeFrame();
    settingsFrame = new SettingsFrame(model);
    initializeMenuBar();
    initializePanels();                
    showPage(FIRST_PAGE);
    this.addWindowStateListener(listener);
}

public SettingsFrame getSettingsFrame() {
    return settingsFrame;
}

private void initializeFrame() {
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    this.setTitle(APPLICATION_TITLE);
    this.settingsFrame = new SettingsFrame(model);
    this.setSize(1400, 900);
    this.setLocationRelativeTo(null);
}    

private void initializePanels() {
    add(new Panel(), FIRST_PAGE);
    add(new Panel(), SECOND_PAGE);
    add(new Panel(), THIRD_PAGE);
}      

Я попытался сделать прослушиватель, поймать событие максимизации и попробовал:

revalidate();
repaint();

также

invalidate();
validate();

но без успеха.

Я узнал что:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

правильно максимизирует кадр, но я не могу использовать это прослушиватель, потому что событие максимизации уже произошло.


person Paul Bota    schedule 01.10.2015    source источник
comment
Чтобы быстрее получить помощь, опубликуйте минимально воспроизводимый пример или Короткий, автономный, правильный пример.   -  person Andrew Thompson    schedule 01.10.2015


Ответы (1)


Вы используете CardLayout, который, к сожалению, не позволит вам чтобы изменить размер JComponent. Поскольку CardLayout может содержать/управлять одним или несколькими компонентами, которые совместно используют одно и то же пространство дисплея.
Вам следует добавить JPanel и установить макет этой панели на CardLayout, если вы хотите его использовать.

Я настоятельно рекомендую прочитать следующую документацию: A Visual Guide to Layout Managers

person Oceans    schedule 01.10.2015
comment
(1+) Да, менеджер компоновки по умолчанию для панели содержимого JFrame — это BorderLayout. Когда вы добавляете компонент в CENTER BorderLayout, компонент получает все пространство, доступное для фрейма. Поэтому оставьте макет панели содержимого в покое и добавьте панель с помощью CardLayout в панель содержимого фрейма. - person camickr; 01.10.2015