GridBagLayout 问题
GridBagLayout issue
我正在尝试使用 GridBagLayout。我需要一个垂直和水平居中的 JLabel - 这很容易,我什至不必创建任何 GridBagConstraints。我还想在右下角放置一个 JButton,当我尝试这样做时,居中的面板向左移动或按钮向上移动。
EXPECTING GETTING THIS OR THIS
+-----------+ +-----------+ +-----------+
| | | | | |
| | | | | |
| | | | | |
| +---+ | | +---+ | | +---+ |
| | | | | | | | | | | |
| +---+ | | +---+ | | +---++---+|
| | | | | | ||
| | | | | +---+|
| +---+ | +---+ | |
| | | | | | | |
+-------+---+ +-------+---+ +-----------+
bigPanel = new JPanel();
bigPanel.setPreferredSize(new Dimension(320, 640));
bigPanel.setLayout(new GridBagLayout());
label = new JLabel();
label.setPreferredSize(new Dimension(100,95));
button = new JButton();
button.setPreferredSize(new Dimension(100,25));
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.CENTER;
bigPanel.add(label, c);
c.anchor = GridBagConstraints.LAST_LINE_END;
bigPanel.add(button, c);
我也曾尝试使用此处描述的其他约束条件http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html,但每次都出现问题。
anchor
如果组件未填满单元格,请在其单元格内设置组件位置。
您尚未定义布局的网格。默认行为是从左到右添加组件。
这是一个使用 GridBagLayout
实现您想要的效果的示例。标签和按钮放在同一个单元格中,填满面板。
public class Test extends JPanel {
public Test() {
super();
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWeights = new double[] { 1.0 }; // expands the 1rst cell of the layout on the vertical axis
gridBagLayout.rowWeights = new double[] { 1.0 }; // expands the 1rst cell of the layout on the horizontal axis
setLayout(gridBagLayout);
JLabel label = new JLabel("test");
label.setOpaque(true);
label.setBackground(Color.RED);
label.setPreferredSize(new Dimension(100, 95));
GridBagConstraints gbc_label = new GridBagConstraints();
gbc_label.gridx = 0; // set label cell (0,0)
gbc_label.gridy = 0;
gbc_label.insets = new Insets(0, 0, 5, 5);
add(label, gbc_label);
JButton button = new JButton("button");
GridBagConstraints gbc_button = new GridBagConstraints();
gbc_button.gridx = 0; // set buttoncell (0,0)
gbc_button.gridy = 0;
gbc_button.anchor = GridBagConstraints.SOUTHEAST;
add(button, gbc_button);
button.setPreferredSize(new Dimension(100, 25));
}
}
我正在尝试使用 GridBagLayout。我需要一个垂直和水平居中的 JLabel - 这很容易,我什至不必创建任何 GridBagConstraints。我还想在右下角放置一个 JButton,当我尝试这样做时,居中的面板向左移动或按钮向上移动。
EXPECTING GETTING THIS OR THIS
+-----------+ +-----------+ +-----------+
| | | | | |
| | | | | |
| | | | | |
| +---+ | | +---+ | | +---+ |
| | | | | | | | | | | |
| +---+ | | +---+ | | +---++---+|
| | | | | | ||
| | | | | +---+|
| +---+ | +---+ | |
| | | | | | | |
+-------+---+ +-------+---+ +-----------+
bigPanel = new JPanel();
bigPanel.setPreferredSize(new Dimension(320, 640));
bigPanel.setLayout(new GridBagLayout());
label = new JLabel();
label.setPreferredSize(new Dimension(100,95));
button = new JButton();
button.setPreferredSize(new Dimension(100,25));
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.CENTER;
bigPanel.add(label, c);
c.anchor = GridBagConstraints.LAST_LINE_END;
bigPanel.add(button, c);
我也曾尝试使用此处描述的其他约束条件http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html,但每次都出现问题。
anchor
如果组件未填满单元格,请在其单元格内设置组件位置。
您尚未定义布局的网格。默认行为是从左到右添加组件。
这是一个使用 GridBagLayout
实现您想要的效果的示例。标签和按钮放在同一个单元格中,填满面板。
public class Test extends JPanel {
public Test() {
super();
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWeights = new double[] { 1.0 }; // expands the 1rst cell of the layout on the vertical axis
gridBagLayout.rowWeights = new double[] { 1.0 }; // expands the 1rst cell of the layout on the horizontal axis
setLayout(gridBagLayout);
JLabel label = new JLabel("test");
label.setOpaque(true);
label.setBackground(Color.RED);
label.setPreferredSize(new Dimension(100, 95));
GridBagConstraints gbc_label = new GridBagConstraints();
gbc_label.gridx = 0; // set label cell (0,0)
gbc_label.gridy = 0;
gbc_label.insets = new Insets(0, 0, 5, 5);
add(label, gbc_label);
JButton button = new JButton("button");
GridBagConstraints gbc_button = new GridBagConstraints();
gbc_button.gridx = 0; // set buttoncell (0,0)
gbc_button.gridy = 0;
gbc_button.anchor = GridBagConstraints.SOUTHEAST;
add(button, gbc_button);
button.setPreferredSize(new Dimension(100, 25));
}
}