我想用擺動佈局從窗口的當前大小計算出的控件之上留下一個間隙。它基本上可以工作,除非控件只在窗口水平調整大小時才移動 - 如果我垂直調整大小,它會保持原來的位置 - 然後水平調整1個像素的大小,它將捕捉到正確的位置。任何人都可以解釋爲什麼調整大小會被忽略,當我只是垂直調整大小?擺動佈局忽略水平調整大小
我已經證明了componentResized()仍然在垂直調整大小上調用,並且contentPane.getWidth()和contentPane.getHeight()仍然會給出正確的值。所以Dimension的大小設置正確,只是被忽略。它就像我需要打電話到contentPane.payAttentionToUpdatesSizesOfYourComponents(),但我找不到任何這樣做的方法。 contentPane.invalidate()不起作用。
也注意到如果我去掉BorderLayout,並在contentPane中直接設置BoxLayout,那麼它就像我想要的那樣工作。然而,對於這個小例子來說,這很好,我有這個問題的真正的窗口在JPanel中設置了一個位於NORTH的JPanel,上面有一個間隙,另一個JPanel中的一些組件位於SOUTH,間距在下面,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