JPanel 中的 GridBagLayout 中的 JButton
JButton in GridBagLayout in a JPanel
我正在学习上周的 swing,我对 GridBagConstraints 有一些问题,无法在左上角放置一个按钮,但在 GridBagConstraints 中默认设置所有其他按钮?
我使用的代码不像原始代码但指出了问题
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
class MyPanel extends JPanel
{
JButton menu = new JButton("Menu"), button = new JButton("Puzzle");
GridBagConstraints gbc1 = new GridBagConstraints(), gbc2 = new GridBagConstraints();
private void setup()
{
gbc1.anchor = GridBagConstraints.FIRST_LINE_START;
gbc2.anchor = GridBagConstraints.CENTER;
gbc2.weightx = 1.0;
gbc2.weighty = 1.0;
}
public MyPanel()
{
this.setLayout(new GridBagLayout());
this.setup();
this.button.setPreferredSize(new Dimension(250, 140));
this.add(menu, gbc1);
this.add(button, gbc2);
}
}
@SuppressWarnings("serial")
public class Test extends JFrame
{
public Test()
{
this.setTitle("Test");
this.setContentPane(new MyPanel());
this.setResizable(false);
this.setSize(800, 600);
this.setVisible(true);
}
public static void main(String args[])
{
SwingUtilities.invokeLater(() -> new Test());
}
}
输出
我想要菜单在顶角。
我从 here 那里读到,但我不明白这个 你能解释一下 GridBagConstraints 如何做到这一点吗?
我希望这个问题很容易理解,如果没有,请在评论中告诉我。
编辑:
@camickr 建议可行但有点问题,拼图按钮不在提取中心。
谢谢。
默认情况下,GridBagLayout 将水平和垂直居中显示所有组件,除非其中一个组件的 weightx/weighty 值不等于 0。然后该组件将填充额外的 space框架。
因此,如果您想要一个组件位于“top/left”,一个组件位于“中心”,您需要:
- 使用“锚点”约束。这两个组件会有所不同。
- 中间的组件需要使用“weightx/weighty”约束。
但是,更简单的解决方案可能是使用具有不同布局管理器的面板组合。
例如:
JPanel menuPanel = new JPanel( new FlowLayout(FlowLayout.LEFT) );
menuPanel.add(menuButton);
JPanel centerPanel = new JPanel( new GridBagLayout() );
centerPanel.add(puzzle, new GridBagConstraints());
frame.add(menuPanel, BorderLayout.PAGE_START);
frame.add(centerPanel, BorderLayout.CENTER);
现在,框架的“顶部”将包含一个面板,其中的组件从左侧显示,而框架的“中心”将包含位于框架其余 space 中心的拼图。
编辑:
I solved it but put gridx and gridy to 0 in center component, but i did not completely understand the setttings
好吧,我提到过您需要使用 gridx/gridy 约束。您应该始终使用这些约束,因为很明显您想要将组件添加到哪个网格。本教程中的示例始终指定这些值。
使用 gridx/gridy 两者都等于 0,实际上没有意义。结果是您有两个组件试图共享同一个网格。
删除 setResizable(false) 语句并缩小框架的大小以查看按钮如何重新定位。
两个组件共享同一个网格是不正常的。通常,第一行是菜单,第二行是按钮。这将使按钮在框架中水平居中,在菜单下方的 space 中垂直居中。
你是干什么的
我正在学习上周的 swing,我对 GridBagConstraints 有一些问题,无法在左上角放置一个按钮,但在 GridBagConstraints 中默认设置所有其他按钮?
我使用的代码不像原始代码但指出了问题
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
class MyPanel extends JPanel
{
JButton menu = new JButton("Menu"), button = new JButton("Puzzle");
GridBagConstraints gbc1 = new GridBagConstraints(), gbc2 = new GridBagConstraints();
private void setup()
{
gbc1.anchor = GridBagConstraints.FIRST_LINE_START;
gbc2.anchor = GridBagConstraints.CENTER;
gbc2.weightx = 1.0;
gbc2.weighty = 1.0;
}
public MyPanel()
{
this.setLayout(new GridBagLayout());
this.setup();
this.button.setPreferredSize(new Dimension(250, 140));
this.add(menu, gbc1);
this.add(button, gbc2);
}
}
@SuppressWarnings("serial")
public class Test extends JFrame
{
public Test()
{
this.setTitle("Test");
this.setContentPane(new MyPanel());
this.setResizable(false);
this.setSize(800, 600);
this.setVisible(true);
}
public static void main(String args[])
{
SwingUtilities.invokeLater(() -> new Test());
}
}
输出
我想要菜单在顶角。
我从 here 那里读到,但我不明白这个 你能解释一下 GridBagConstraints 如何做到这一点吗?
我希望这个问题很容易理解,如果没有,请在评论中告诉我。
编辑:
@camickr 建议可行但有点问题,拼图按钮不在提取中心。
谢谢。
默认情况下,GridBagLayout 将水平和垂直居中显示所有组件,除非其中一个组件的 weightx/weighty 值不等于 0。然后该组件将填充额外的 space框架。
因此,如果您想要一个组件位于“top/left”,一个组件位于“中心”,您需要:
- 使用“锚点”约束。这两个组件会有所不同。
- 中间的组件需要使用“weightx/weighty”约束。
但是,更简单的解决方案可能是使用具有不同布局管理器的面板组合。
例如:
JPanel menuPanel = new JPanel( new FlowLayout(FlowLayout.LEFT) );
menuPanel.add(menuButton);
JPanel centerPanel = new JPanel( new GridBagLayout() );
centerPanel.add(puzzle, new GridBagConstraints());
frame.add(menuPanel, BorderLayout.PAGE_START);
frame.add(centerPanel, BorderLayout.CENTER);
现在,框架的“顶部”将包含一个面板,其中的组件从左侧显示,而框架的“中心”将包含位于框架其余 space 中心的拼图。
编辑:
I solved it but put gridx and gridy to 0 in center component, but i did not completely understand the setttings
好吧,我提到过您需要使用 gridx/gridy 约束。您应该始终使用这些约束,因为很明显您想要将组件添加到哪个网格。本教程中的示例始终指定这些值。
使用 gridx/gridy 两者都等于 0,实际上没有意义。结果是您有两个组件试图共享同一个网格。
删除 setResizable(false) 语句并缩小框架的大小以查看按钮如何重新定位。
两个组件共享同一个网格是不正常的。通常,第一行是菜单,第二行是按钮。这将使按钮在框架中水平居中,在菜单下方的 space 中垂直居中。 你是干什么的