好的,所以我正在搞乱GridBagLayout以掌握它。我想用它来在JFrame中布局JPanels,但是这些单独的面板将使用不同的布局管理器,GridBagLayout可能不适合。
但我有一个问题。如果我没有向面板添加任何内容,则所有比例都完美地完成,如下例所示:
public class RealMess extends JFrame{
private JPanel panel;
public RealMess(){
initUI();
}
public final void initUI(){
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int) screensize.getWidth();
int height = (int) screensize.getHeight();
panel = new JPanel();
panel.setLayout(new GridBagLayout());
JPanel left = new JPanel();
left.setBackground(Color.GREEN);
JPanel centre = new JPanel();
centre.setBackground(Color.PINK);
JPanel right = new JPanel();
right.setBackground(Color.CYAN);
JPanel leftBottom = new JPanel();
leftBottom.setBackground(Color.LIGHT_GRAY);
leftBottom.setLayout(new FlowLayout(0));
JPanel bottom = new JPanel();
bottom.setBackground(Color.MAGENTA);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 0.11;
gbc.weighty = 0.9;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
panel.add(left, gbc);
gbc.weightx = 0.11;
gbc.weighty = 0.1;
gbc.anchor = GridBagConstraints.LAST_LINE_START;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
panel.add(leftBottom, gbc);
gbc.weightx = 0.78;
gbc.weighty = 0.9;
gbc.anchor = GridBagConstraints.PAGE_START;
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
panel.add(centre, gbc);
gbc.weightx = 0.78;
gbc.weighty = 0.1;
gbc.anchor = GridBagConstraints.PAGE_END;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
panel.add(bottom, gbc);
gbc.weightx = 0.11;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_END;
gbc.gridx = 2;
gbc.gridy = 0;
gbc.gridheight = 2;
gbc.fill = GridBagConstraints.BOTH;
panel.add(right, gbc);
add(panel);
setTitle("Jack");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
RealMess rm = new RealMess();
rm.setVisible(true);
}
});
}
}
我知道我不必要地重新定义了一些GridBagConstraints,但我不想错过任何东西。
无论如何,当我向任何面板添加按钮时,我的问题就出现了。像这样:
public class RealMess extends JFrame{
private JPanel panel;
public RealMess(){
initUI();
}
public final void initUI(){
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int) screensize.getWidth();
int height = (int) screensize.getHeight();
panel = new JPanel();
panel.setLayout(new GridBagLayout());
JPanel left = new JPanel();
left.setBackground(Color.GREEN);
JPanel centre = new JPanel();
centre.setBackground(Color.PINK);
JPanel right = new JPanel();
right.setBackground(Color.CYAN);
JPanel leftBottom = new JPanel();
leftBottom.setBackground(Color.LIGHT_GRAY);
leftBottom.setLayout(new FlowLayout(0));
JButton rewind = new JButton("1");
rewind.setPreferredSize(new Dimension(50, 25));
leftBottom.add(rewind);
JPanel bottom = new JPanel();
bottom.setBackground(Color.MAGENTA);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 0.11;
gbc.weighty = 0.9;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
panel.add(left, gbc);
gbc.weightx = 0.11;
gbc.weighty = 0.1;
gbc.anchor = GridBagConstraints.LAST_LINE_START;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
panel.add(leftBottom, gbc);
gbc.weightx = 0.78;
gbc.weighty = 0.9;
gbc.anchor = GridBagConstraints.PAGE_START;
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
panel.add(centre, gbc);
gbc.weightx = 0.78;
gbc.weighty = 0.1;
gbc.anchor = GridBagConstraints.PAGE_END;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
panel.add(bottom, gbc);
gbc.weightx = 0.11;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.FIRST_LINE_END;
gbc.gridx = 2;
gbc.gridy = 0;
gbc.gridheight = 2;
gbc.fill = GridBagConstraints.BOTH;
panel.add(right, gbc);
add(panel);
setTitle("Jack");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
RealMess rm = new RealMess();
rm.setVisible(true);
}
});
}
}
bottomLeft面板变得更大,因此网格方块的大小与之相关。
在第一个例子中,所有内容都占据窗口宽度或高度的百分比:
gbc.weightx
和
gbc.weighty
这样做可以很容易地使一切都正确。
是否有解决方法允许我强制仅通过重量值影响面板尺寸?
答案 0 :(得分:1)
weightx和weighty显示基础组件未请求的空间的比例分配。例如,如果您有一个标签和一个水平方向的文本字段,您可能希望标签根据列中的最大标签采取固定数量的间距,并将空间的其余部分转到文本字段。将所有权重x分配给文本字段,这正是发生的事情。该标签的重量为零,但不会被压缩到零尺寸,因为只有多余的空间由重量决定。空面板的最小尺寸为零,因此所有空间都被视为额外空间。
如果要强制布局按照您的描述工作,则需要将子面板的JPanel扩展到GridBagLayout以了解其内容。如果你开始制作小于最小值的东西,这可能会让你陷入困境。