У меня есть пользовательский интерфейс среднего размера, который использует 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();
}
}
Если вы увеличите окно, выпадающие списки в центре увеличатся; как написано, вертикальный кусок клея под ними также увеличивается, но не занимает все доступное пространство. Кажется, ему отведено столько же места, сколько каждому из них.
Так как же лучше подойти к этому?