Java - обновить размер компонента после события изменения размера

У меня есть этот простой код:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.border.LineBorder;

@SuppressWarnings("serial")
public class MyFrame extends JFrame{

    SpringLayout layout;
    JPanel contentPane;
    JPanel pane1;

    public MyFrame(){

        layout=new SpringLayout();
        contentPane=new JPanel(layout);
        setContentPane(contentPane);
        setSize(new Dimension(800,600));

        pane1=new JPanel(new SpringLayout());
        pane1.setPreferredSize(new Dimension(200,200));
        pane1.setBorder(new LineBorder(Color.black));

        layout.putConstraint(SpringLayout.WEST, pane1, 0, SpringLayout.WEST, contentPane);
        layout.putConstraint(SpringLayout.EAST, pane1, getWidth()/2, SpringLayout.WEST, contentPane);
        contentPane.add(pane1);

        setEvents();
        setVisible(true);
    }

    private void setEvents(){

        addWindowListener(new WindowAdapter(){

            public void windowClosing(WindowEvent e){

                dispose();
                System.exit(0);
            }
        });

        this.addComponentListener(new ComponentListener(){

            @Override
            public void componentHidden(ComponentEvent arg0) {}

            @Override
            public void componentMoved(ComponentEvent arg0) {}

            @Override
            public void componentResized(ComponentEvent arg0) {

                System.out.println("RESIZING EVENT:");
                System.out.println("Frame Size: "+getWidth()+", "+getHeight());
                System.out.println("Pane1 Size: "+pane1.getWidth()+", "+pane1.getHeight()+"\n");


                layout.putConstraint(SpringLayout.EAST, pane1, getWidth()/2, SpringLayout.WEST, contentPane);
                contentPane.revalidate();
                contentPane.repaint();
            }

            @Override
            public void componentShown(ComponentEvent arg0) {}
        });
    }

    public static void main(String[] args){

        MyFrame frame=new MyFrame();
    }
}

У меня проблемы с получением фактического размера моего компонента pane1.

если я выполню свой код, MAXIMIZE и восстановлю свое окно, числа будут неправильными. Позвольте мне объяснить с простым выводом этого кода:

Изменение размера: Размер кадра: 800, 600 Размер панели1: 400, 200

Изменение размера: Размер кадра: 800, 600 Размер панели1: 400, 200

ИЗМЕНЕНИЕ СОБЫТИЙ: Размер кадра: 1382, 744 Размер панели1: 400, 200 здесь можно развернуть

ИЗМЕНЕНИЕ СОБЫТИЙ: Размер кадра: 800, 600 Размер панели1: 691, 200 восстановление здесь

Как видите, последнее значение измерения (691, 200) следует ссылаться на (1382,744) измерение кадра, а не на последнее (800,600)...

вызов методов revalidate и repaint обновляет мою графику (показывая, что ожидается от этого кода), но не помогает с этой проблемой. Любая помощь приветствуется

1 ответ

Проблема в том, что он используется в двух разных конфликтующих ролях. Сначала код использует панель содержимого с вызовом setContentPane(contentPane). Затем рассматривается как дочерний элемент самого себя при использовании в качестве аргумента для .

Панель содержимого является родителем дочернего элемента этого JFrameи контейнер, для которого применяется макет. Видеть [RootPaneContainer][1].

Поэтому вам нужна третья панель. Я предлагаю назвать это panelWestи использовать его в layout.putConstraintвместо . Не забудьте инициализировать его и добавить в , как panel. И удалите все вызовы, чтобы добавить к себе (включая добавление его к , что будет добавлять его к себе), и удалите все настройки констант макета для contentPaneкак будто это ребенок MyFrame.

Другие вопросы по тегам