【问题标题】:Setting multiple JPanels to JFrame将多个 JPanel 设置为 JFrame
【发布时间】:2015-05-16 01:14:15
【问题描述】:

我需要将我的多个面板格式化到我的主面板中,但是我对使用哪个布局以及如何使用特定布局进行更多操作感到困扰。

我需要的布局是这样的

到目前为止,我的代码是这样的:

public TDPanel(){
    this.setPreferredSize(new Dimension(1150,800));
    this.setBackground(Color.gray);
    this.tdWorld = towerOfDefenses;
    this.setLayout(new FlowLayout());

game = new JPanel();
game.setBackground(Color.blue);
game.setPreferredSize(new Dimension(300,300));

textBox = new JTextField();
textBox.setBackground(Color.ORANGE);
textBox.setPreferredSize(new Dimension(400,300));

menuPanel = new JPanel();
menuPanel.setPreferredSize(new Dimension(100,800));
menuPanel.setBackground(Color.red);

this.add(game);
this.add(textBox);
this.add(menuPanel);
}

如果能提供任何帮助,我将不胜感激!

【问题讨论】:

  • GUI 是否可以调整大小,如果可以,如何分配额外空间?
  • 顺便说一句 - 我可能会为那个 GUI 使用 GridBagLayout
  • 我看到BorderLayout,可能是GridLayoutJSplitPaneGridBagLayout
  • GUI 可以调整大小,感谢您的建议!
  • 我看到GridBagLayoutGroupLayout

标签: java swing jpanel layout-manager


【解决方案1】:

我会结合至少 3 个BorderLayouts。为什么?因为您放入 CENTER 的组件将被最大化,而对于其他组件,您可以设置静态宽度(或高度),无需进行进一步配置即可获得所需的行为。

+-------------------------+-----------------------+
| BorderLayout.CENTER (1) | BorderLayout.EAST (2) |
+-------------------------+-----------------------+

在 (1) 中放置游戏面板 (3) 和“游戏控件” (4):

+-------------------------+
| BorderLayout.CENTER (3) |
+-------------------------+
| BorderLayout.SOUTH (4)  |
+-------------------------+

如果您希望 (4) 中的文本字段和按钮具有相同的大小和最大化(宽度),则使用 GridLayout,否则您可以使用 FlowLayout 将它们布局后留出一些空间.但是我这里推荐的做法和(2)中的游戏和菜单面板一样:使用BorderLayout,把你想要最大化的组件放在中间。

您可以使用更复杂的 LayoutManager,例如 BoxLayoutGridBagLayout,但这种简单的布局实际上并不需要它(我猜这是个人喜好问题)。

【讨论】:

  • 抱歉,您能否详细解释一下 3 个边框布局以及如何创建 3 个不同的布局?
  • 是的,我没有明确说出来,但是您可以只使用普通的 JPanel 并将 LayoutManager 设置为 (1) 到 (4),然后在其中放置原始面板。跨度>
  • 是的,要走的路是使用自己的布局嵌套每个 JPanel。 1+ @EasonLiu:如果这个答案对你有帮助,你应该投票。如果它帮助你解决了你的问题,你应该接受它。有关更多信息,请从帮助站点阅读此部分:someone answers
【解决方案2】:

首先,我推荐你使用Swing Desinger,它是一个可视化你的操作的插件。 我正在使用GridBagLayout 来格式化这些面板,这是一个示例。 This is the effect drawing adress

public test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 685, 485);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    GridBagLayout gbl_contentPane = new GridBagLayout();
    gbl_contentPane.columnWidths = new int[]{175, 40, 180, 217, 0};
    gbl_contentPane.rowHeights = new int[]{15, 58, 220, 49, 55, 0};
    gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    contentPane.setLayout(gbl_contentPane);

    JPanel gamepanel = new JPanel();
    GridBagConstraints gbc_gamepanel = new GridBagConstraints();
    gbc_gamepanel.fill = GridBagConstraints.BOTH;
    gbc_gamepanel.insets = new Insets(0, 0, 5, 5);
    gbc_gamepanel.gridheight = 2;
    gbc_gamepanel.gridwidth = 3;
    gbc_gamepanel.gridx = 0;
    gbc_gamepanel.gridy = 1;
    contentPane.add(gamepanel, gbc_gamepanel);
    gamepanel.setLayout(null);

    JScrollPane scrollPane = new JScrollPane();
    GridBagConstraints gbc_scrollPane = new GridBagConstraints();
    gbc_scrollPane.fill = GridBagConstraints.BOTH;
    gbc_scrollPane.insets = new Insets(0, 0, 5, 0);
    gbc_scrollPane.gridx = 3;
    gbc_scrollPane.gridy = 1;
    contentPane.add(scrollPane, gbc_scrollPane);

    JPanel panel = new JPanel();
    GridBagConstraints gbc_panel = new GridBagConstraints();
    gbc_panel.fill = GridBagConstraints.BOTH;
    gbc_panel.gridheight = 3;
    gbc_panel.gridx = 3;
    gbc_panel.gridy = 2;
    contentPane.add(panel, gbc_panel);
    panel.setLayout(null);

    textField = new JTextField();
    GridBagConstraints gbc_textField = new GridBagConstraints();
    gbc_textField.fill = GridBagConstraints.BOTH;
    gbc_textField.insets = new Insets(0, 0, 0, 5);
    gbc_textField.gridx = 0;
    gbc_textField.gridy = 4;
    contentPane.add(textField, gbc_textField);
    textField.setColumns(10);

    JButton btnNewButton = new JButton("New button");
    GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
    gbc_btnNewButton.fill = GridBagConstraints.BOTH;
    gbc_btnNewButton.insets = new Insets(0, 0, 0, 5);
    gbc_btnNewButton.gridx = 2;
    gbc_btnNewButton.gridy = 4;
    contentPane.add(btnNewButton, gbc_btnNewButton);
}

如果您希望 GUI 可以调整大小,您可以设置 weghitxweghity 属性。

【讨论】:

  • 哇,谢谢你的代码,你能解释一下gridx、gridy和gbc_panel.fill等一些部分吗?这些对面板有什么影响。
  • 好吧,我英语不好。所以我只是尽可能地解释它。gridx表示行的位置,gridy表示列的位置。gbc_panel.fill表示以水平或垂直方式拉伸组件。
  • BTW-你能看懂中文吗?
  • 这段代码写得不好。您重新创建 GridBagConstraints 而不是重用它。您还可以设置大小,而不是让布局管理器决定如何处理它。
  • @user1803551:我同意您关于设置大小的评论,但不同意关于重新使用 GBC 的评论。我在这个主题上看到的大多数教程都建议每次都重新创建 GBC,以避免在不知不觉中延续不需要的状态。我自己,我通常创建一个静态方法,比如public GridBagConstraints createGbc(int x, int y, int w, int h) 来为每个组件插入创建一个 GBC。
猜你喜欢
  • 2011-11-30
  • 2012-05-02
  • 2011-09-13
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多