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
.