4

我正在尝试创建一个JPanel使用FlowLayout. 该面板位于containerusing 中BorderLayout。然后container使用 将其添加到卡片中CardLayout。我希望使用FLowLayoutot 的面板是面板左下角的一个小框BorderLayout。我该怎么做?我已经使用过settingsPanel.setPreferredSize(new Dimension(10, 425));,但无论我设置什么尺寸,宽度仍然跨越整个面板,尽管高度会发生变化。我将如何改变宽度?

代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class Main {
    //Settings Panel variables
    JLabel settingsTitle = new JLabel("Settings");

    public Main()
    {
        JPanel mainCard = new JPanel(new BorderLayout(8,8));
        JPanel settingsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        settingsTitle.setFont(new Font("TimesRoman", Font.PLAIN, 35));
        settingsPanel.add(settingsTitle);

        final CardLayout layout = new CardLayout();
        final JPanel cards = new JPanel(layout);
        cards.add(mainCard, "2");

        mainCard.add(settingsPanel, BorderLayout.SOUTH);

        settingsPanel.setPreferredSize(new Dimension(10, 425));
        settingsPanel.setBorder(BorderFactory.createLineBorder(Color.black));

        layout.show(cards, "1");

        JFrame window = new JFrame("Test");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(cards);
        window.setSize(1280, 720);
        window.setLocationRelativeTo(null);
        window.setResizable(false);
        window.setVisible(true);

    }

    public static void main(String[] args)
    {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });

    }
}

例子:

在此处输入图像描述

4

2 回答 2

2

所以这是你的代码改变BorderLayoutwith GridBagLayout。GridBagLayout 的核心思想是您将拥有一个包含多行和多列(不同大小)的网格,并且您可以在每个单元格中放置组件。它的巧妙之处在于它非常强大:当您将组件放置在单元格中时,您可以自定义以下内容:

  • 它可以跨越多少个单元格(垂直、水平或两者)(gridwidth/gridheight)
  • 在单元格中放置它的位置:中心,左上角,右下角......(锚点)
  • 每行/列的权重,这是他们在调整/分配窗口大小时按比例占用的空间量。(重量x,重量)
  • 它们是否必须占据必要的最大或最小空间。(填)

除其他事项外。最后一点是您的问题,BorderLayout 迫使您的面板尽可能地扩展。在我的代码中,我使用fill = NONE并将其设置为,anchor = LAST_LINE_START因此它保持在左下角并且不会扩展。

您可以使用这些参数,所有信息都在教程中。所有这一切的关键是知道你的网格是怎样的。在这个例子中它非常简单,它只是一个 1x1。但是看一下教程:那些上面涂有红色网格的图像,这就是你必须记住的。除此之外,知道所有变量,唯一棘手的事情是权重是如何工作的。

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;

    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;    
    public class Main {
    //Settings Panel variables
    JLabel settingsTitle = new JLabel("Settings");

    public Main()
    {
        JPanel mainCard = new JPanel(new GridBagLayout());
        JPanel settingsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        settingsTitle.setFont(new Font("TimesRoman", Font.PLAIN, 35));
        settingsPanel.add(settingsTitle);

        final CardLayout layout = new CardLayout();
        final JPanel cards = new JPanel(layout);
        cards.add(mainCard, "2");

        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.anchor = GridBagConstraints.LAST_LINE_START;
        c.fill = GridBagConstraints.NONE; //uneeded line because it's the default value, but it has to be NONE

        mainCard.add(settingsPanel, c);

       // settingsPanel.setPreferredSize(new Dimension(300, 425)); //the components inside settingsPanel will set its side
        settingsPanel.setBorder(BorderFactory.createLineBorder(Color.black));

        layout.show(cards, "1");

        JFrame window = new JFrame("Test");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(cards);
        window.setSize(1280, 720); ///replace with window.pack()
        window.setLocationRelativeTo(null);
        window.setResizable(false);
        window.setVisible(true);

    }

    public static void main(String[] args)
    {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });

    }
}
于 2014-02-26T22:02:54.907 回答
1

首先摆脱这个:settingsPanel.setPreferredSize(new Dimension(10, 425))让布局管理器完成他们的工作。

我能想到的最简单的方法就是包装settingsPanel在一个不同的面板中并将最后一个添加到 SOUTH:

 JPanel wrapPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 wrapPanel.add(settingsPanel);

 JPanel mainCard = new JPanel(new BorderLayout(8,8));
 mainCard.add(wrapPanel, BorderLayout.SOUTH); // add wrapPanel here instead of settingsPanel

通过这种方式,您可以利用FlowLayout属性来填充所需的较小空间:

在此处输入图像描述

真的离题,但我认为这是值得的

正如我已经在您之前的问题中评论过的那样,这个面板的事情让我想起了这个Portal 2: Panels视频。我们也需要一些时间来笑,你不觉得吗?

于 2014-02-26T21:32:24.243 回答