스윙 레이아웃을 사용하여 현재 창의 크기에서 계산 된 컨트롤 위에 간격을 두려고합니다. 기본적으로 윈도우가 가로로 크기가 조정될 때만 컨트롤이 이동한다는 점을 제외하고는 기본적으로 작동합니다. 세로로 크기를 조정하면 위치가 그대로 유지되고 가로로 1 픽셀 크기가 조정되면 올바른 위치에 스냅됩니다. 아무도 수직으로 크기를 조정할 때 크기 조정이 무시되는 이유를 설명 할 수 있습니까?스윙 레이아웃에서 가로 크기 조절을 무시합니다.
저는 componentResized()가 여전히 수직 크기 변경에서 호출되고 있으며 contentPane.getWidth() 및 contentPane.getHeight()가 여전히 올바른 값을 제공한다는 것을 입증했습니다. 따라서 Dimension의 크기가 올바르게 설정되고 무시됩니다. 그것처럼 나는 contentPane.payAttentionToUpdatesSizesOfYourComponents()에 전화를 걸 필요가 있지만,이 작업을 수행하는 모든 방법을 찾을 수 없습니다. contentPane.invalidate()는 아무 효과가 없습니다.
또한 BorderLayout을 제거하고 contentPane에서 BoxLayout을 직접 설정하면 원하는대로 작동합니다. 그러나이 작은 예제에서는 괜찮습니다.이 문제가있는 실제 창에는 위의 갭이있는 북쪽의 JPanel에있는 일부 구성 요소와 아래에 갭이있는 나머지 다른 JPanel의 일부 구성 요소가 있으며 BorderLayout은 유일한 것입니다 방법을 올바르게 배치 할 수 있으므로이를 제거 할 수 없습니다.
모든 조언이나 제안을 환영합니다!
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.Box.Filler;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public final class ResizeOnlyWorksHorizontally
{
public static final void main (final String [] args)
{
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
final JPanel contentPane = new JPanel();
frame.setContentPane (contentPane);
contentPane.setLayout (new BorderLayout());
final JPanel top = new JPanel();
top.setLayout (new BoxLayout (top, BoxLayout.Y_AXIS));
contentPane.add (top, BorderLayout.NORTH);
// Put a space, then a label below it
final Dimension startSpace = new Dimension (0, 0);
final Filler filler = new Filler (startSpace, startSpace, startSpace);
top.add (filler);
top.add (new JLabel ("Text"));
contentPane.addComponentListener (new ComponentAdapter()
{
@Override
public final void componentResized (final ComponentEvent e)
{
// Just any calc based on contentPane width and height to demo problem
final int calc = (contentPane.getWidth() + contentPane.getHeight())/2;
// Alter the size of the space above the label
final Dimension newSpace = new Dimension (0, calc);
filler.setMinimumSize (newSpace);
filler.setPreferredSize (newSpace);
filler.setMaximumSize (newSpace);
}
});
frame.pack();
frame.setVisible (true);
}
}
대단히 감사에서 밀어 주셔서 대단히 감사합니다 - filler.revalidate() 작동, 나는 내가 제약 조건을 변경하는 동안이었다 내가 없어진 것 같아요 필러의 크기를 강제로 적용하려면 컨테이너를 옮길 필요가 없었습니다. – nigelg