У меня средний и большой пользовательский интерфейс, который использует BorderLayout; центр представляет собой панель с вкладками, содержащую различные панели с различными макетами и т. д.
Я хочу, чтобы размер панели в центре этого макета границы изменялся в соответствии с размером
окно, но я не хочу растягивать компоненты внутри панели. Метки, поля со списком, текстовые поля, кнопки - я хочу, чтобы они оставались в своих предпочтительных размерах и позволяли растягивать панель, которая их содержит. Я помещаю их в область прокрутки на случай, если пространство станет слишком маленьким для панели.
Различные плакаты с красочными словарями предупреждают об опасности использования любого из методов setXXXsize () для компонентов. Это то, что я делаю сейчас, и я хотел бы узнать, как этого избежать.
GridBagLayout не подходит для некоторых моих панелей. По своей природе он ориентирован вокруг строк и столбцов, и не все вписывается в строки и столбцы. Конечно, я мог бы создать искусственные строки и столбцы, чтобы вместить все, но я действительно надеюсь, что у Swing есть больше вариантов макета, чем это.
Вертикальный клей тоже этого не делает. Я включил его в любимый SSCE HFOE:
package example;
import java.awt.BorderLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BorderAndBox extends JFrame
{
public static void main(String args[])
{
BorderAndBox bnb = new BorderAndBox();
bnb.createUI();
bnb.setVisible(true);
}
public void createUI()
{
JPanel borderPanel = new JPanel(new BorderLayout());
JLabel northLabel = new JLabel("Nawth");
borderPanel.add(northLabel, BorderLayout.NORTH);
String[] southComboChoices = { "one", "two", "three" };
JComboBox southCombo = new JComboBox(southComboChoices);
borderPanel.add(southCombo, BorderLayout.SOUTH);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
String[] firstChoices = { "first", "uno", "UN" };
String[] secondChoices = { "second", "dos", "zwei" };
String[] thirdChoices = { "third", "tres", "drei" };
JComboBox firstCombo = new JComboBox(firstChoices);
JComboBox secondCombo = new JComboBox(secondChoices);
JComboBox thirdCombo = new JComboBox(thirdChoices);
centerPanel.add(firstCombo);
centerPanel.add(secondCombo);
centerPanel.add(thirdCombo);
centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT
// take up available vertical space, instead it appears to create a space
// that is shared equally among the (now) four components of this space.
borderPanel.add(centerPanel, BorderLayout.CENTER);
getContentPane().add(borderPanel);
pack();
}
}
Если вы увеличите окно, выпадающие списки в центре увеличатся; как написано, вертикальная часть клея под ними также увеличивается, но не занимает все доступное пространство. Похоже, ему дается столько же места, сколько каждому из них.
Так, как хороший способ приблизиться к этому?