У меня есть приложение с несколькими панелями; Я хотел бы иметь возможность использовать разные менеджеры компоновки для разных панелей, но хотел бы, чтобы они вели себя одинаково, когда пользователь изменяет размер окна.
package example;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
public class TP1 extends JFrame
{
public static void main(String[] args)
{
TP1 tp1 = new TP1();
tp1.go();
}
public void go()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
// create a panel with some labels on it
JPanel innerFirst = new JPanel();
innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS));
innerFirst.add(new JLabel("one"));
innerFirst.add(new JLabel("two"));
innerFirst.add(new JLabel("three"));
innerFirst.add(new JLabel("four"));
// put that panel in a scroll pane
JScrollPane firstSP = new JScrollPane(innerFirst);
// make another panel and put our scrolled panel in it
JPanel outerFirst = new JPanel();
outerFirst.setLayout(new BoxLayout(outerFirst, BoxLayout.PAGE_AXIS));
outerFirst.add(firstSP);
// create a GridBagLayout panel with some text fields on it
JPanel innerSecond = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = .25;
gbc.anchor = GridBagConstraints.LINE_START;
innerSecond.add(new JTextField(8), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
innerSecond.add(new JTextField(10), gbc);
gbc.gridx =0;
gbc.gridy = 2;
innerSecond.add(new JTextField(12), gbc);
// put that panel in a scroll pane
JScrollPane secondSP = new JScrollPane(innerSecond);
// make another panel and put our second scrolled panel in it
JPanel outerSecond = new JPanel();
outerSecond.setLayout(new BoxLayout(outerSecond, BoxLayout.LINE_AXIS));
outerSecond.add(secondSP);
JPanel innerThird = new JPanel(new GridBagLayout());
GridBagConstraints gbc3 = new GridBagConstraints();
gbc3.anchor = GridBagConstraints.LINE_END;
gbc.weightx = .25;
gbc3.gridx = 0;
gbc3.gridy = 0;
innerThird.add(new JLabel("1st label"), gbc3);
gbc3.gridy = 1;
innerThird.add(new JLabel("second label"), gbc3);
gbc3.gridy = 2;
innerThird.add(new JLabel("IIIrd label"), gbc3);
gbc3.anchor = GridBagConstraints.LINE_START;
gbc3.gridx = 1;
gbc3.gridy = 0;
innerThird.add(new JTextField(8), gbc3);
gbc3.gridy = 1;
innerThird.add(new JTextField(12), gbc3);
gbc3.gridy = 2;
innerThird.add(new JTextField(14), gbc3);
JScrollPane thirdSP = new JScrollPane(innerThird);
JPanel outerThird = new JPanel();
outerThird.setLayout(new BoxLayout(outerThird, BoxLayout.LINE_AXIS));
outerThird.add(thirdSP);
// put the scrolled panes onto a tabbed pane
JTabbedPane tp = new JTabbedPane();
tp.add("text fields", outerSecond);
tp.add("labels", outerFirst);
tp.add("mixed", outerThird);
// add the tabbed pane to the frame
this.add(tp);
// pack it and ship it.
pack();
setVisible(true);
}
}
Запустив приведенный выше код, мы получим окно с панелью с вкладками с тремя вкладками. Если мы уменьшим окно, все они получат полосы прокрутки, как и предполагалось. Если мы увеличим его, все три ведут себя по-разному: вкладка с метками оставляет их только в верхнем левом углу окна, вкладка с полями только центрирует их вертикально по левому краю, а вкладка с сеткой смешанных меток и полей центрирует их как по горизонтали, так и по вертикали в увеличенном окне.
Это неприемлемо для приложения; Мне нужно каким-то образом сделать так, чтобы все панели вели себя одинаково. Мне нужно, чтобы все они имели полосы прокрутки, и я хотел бы, чтобы все они держались в левом верхнем углу, если окно сделано больше, чем внутренняя панель.
Еще одно требование: мои вкладки заняты чем-то, что расширяет JPanel, мне сказали, прежде чем я могу поместить JScrollPane прямо во вкладку, но для моего приложения я тоже не хочу этого делать. Это просто делает другие вещи более сложными, чем они должны быть.
Помимо желания разместить все дополнительное пространство внизу и справа, мне очень хотелось бы понять, ПОЧЕМУ эти три ситуации ведут себя по-разному. Я по-прежнему считаю, что всем нам было бы лучше, если бы мы понимали принципы, лежащие в основе того, что мы делаем, вместо того, чтобы просто копировать примеры направо и налево и делать что-то методом проб и ошибок, пока оно не сработает.
(Между прочим, у меня есть панель GroupLayout, которая, кажется, тяготеет к левому верхнему углу, но я не думаю, что это необходимо для моего вопроса, и это 100 строк кода как есть.)