Я пытаюсь с макетами Swing оставлять пробел над элементами управления, которые вычисляются из текущего размера окна. Это в основном работает, за исключением того, что элемент управления перемещается только тогда, когда окно изменяется горизонтально - если я изменяю размер по вертикали, он остается там, где он есть, - затем изменяя размер 1 пиксель по горизонтали, он защелкивается в нужное место. Может ли кто-нибудь объяснить, почему изменение размера игнорируется, когда я только изменяю размер по вертикали?Swing layout игнорирует горизонтальное изменение размера
Я доказал, что элемент componentResized() по-прежнему вызывается с вертикальными размерами и что contentPane.getWidth() и contentPane.getHeight() все равно дают правильные значения. Таким образом, размер измерения задается правильно, просто игнорируется. Мне нравится, что мне нужно вызвать вызов contentPane.payAttentionToUpdatesSizesOfYourComponents(), но я не могу найти какой-либо метод, который сделает это. contentPane.invalidate() не влияет.
Также заметил, что если я удаляю BorderLayout и устанавливаю BoxLayout непосредственно в contentPane, то он работает так, как я хочу. Однако, хотя это хорошо для этого крошечного примера, у реального окна, в котором я столкнулся с этой проблемой, есть некоторые компоненты в JPanel, установленном в NORTH с вышеперечисленным промежутком, некоторые компоненты в другом 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