java - GridBagLayout 格式不正确

标签 java swing debugging

我试图让配置面板占据屏幕顶部,然后将输入和输出面板并排放置。我还尝试让每个文本区域宽 70 个字符,高 30 行。然而,现在,配置面板根本没有显示,文本区域只有 35 个字符宽和 2 行高。我遵循了我找到的所有示例和教程。我做错了什么?

public class BorderWrapper {
    public static void main(String[] args) {
        //Create frame
        JFrame frame = new JFrame("Border Wrapper");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create main panel
        MainPanel panel = new MainPanel();
        frame.getContentPane().add(panel, BorderLayout.NORTH);

        //Display frame
        Dimension minSize = new Dimension(650, 375);
        frame.setPreferredSize(minSize);
        frame.setMinimumSize(minSize);
        frame.pack();
        frame.setVisible(true);
    }
}



public class MainPanel extends JPanel {
    private static final Font INPUT_FONT = new Font("Monospaced", Font.PLAIN, 12);

    private JTextArea inputArea, outputArea;
    private JTextField titleField, topBorderField, sideBorderField;

    public MainPanel() {
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        //Set up config panel
        JPanel configPanel = new JPanel();
        configPanel.setLayout(new BoxLayout(configPanel, BoxLayout.X_AXIS));
        configPanel.setMaximumSize(new Dimension(400, 200));

        titleField      = new JTextField(25);
        titleField.setFont(INPUT_FONT);
        topBorderField  = new JTextField(1);
        topBorderField.setFont(INPUT_FONT);
        sideBorderField = new JTextField(4);
        sideBorderField.setFont(INPUT_FONT);

        configPanel.add(new JLabel("Title:"));
        configPanel.add(titleField);
        configPanel.add(new JLabel("Top border:"));
        configPanel.add(topBorderField);
        configPanel.add(new JLabel("Side border:"));
        configPanel.add(sideBorderField);

        c.gridwidth = 2;
        c.gridx     = 0;
        c.gridy     = 0;
        add(configPanel, c);

        //Set up Input panel
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.Y_AXIS));
        inputArea = new JTextArea("Type or paste your stuff here . . .");
        inputArea.setFont(INPUT_FONT);
        inputArea.setLineWrap(true);
        inputArea.setWrapStyleWord(true);
        inputArea.setColumns(75);
        JScrollPane inputPane = new JScrollPane(inputArea);
        inputPane.setMinimumSize(new Dimension(250, 400));

        JLabel inputLabel = new JLabel("Text Box");
        inputLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        inputPanel.add(inputLabel);
        inputPanel.add(inputPane);
        inputPanel.setMinimumSize(new Dimension(250, 400));

        c.gridwidth = 1;
        c.gridx     = 0;
        c.gridy     = 1;
        add(inputPanel, c);

        //Set up Output panel
        JPanel outputPanel = new JPanel();
        outputPanel.setLayout(new BoxLayout(outputPanel, BoxLayout.Y_AXIS));
        outputArea = new JTextArea();
        outputArea.setFont(INPUT_FONT);
        outputArea.setLineWrap(true);
        outputArea.setWrapStyleWord(true);
        outputArea.setColumns(75);
        JScrollPane outputPane = new JScrollPane(outputArea);
        outputPane.setMinimumSize(new Dimension(250, 400));

        JLabel outputLabel = new JLabel("Wrapped Output");
        outputLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        outputPanel.add(outputLabel);
        outputPanel.add(outputPane);
        outputPanel.setMinimumSize(new Dimension(250, 400));

        c.gridwidth = 1;
        c.gridx     = 1;
        c.gridy     = 1;
        add(outputPanel, c);
    }
}

最初,我打算尝试使用 BorderLayout,因为它似乎对我尝试制作的布局最有意义,但当我将它们设置为 BorderLayout.WEST 和 BorderLayout 时,效果甚至更糟。东方。

最佳答案

已修改您的程序以在 MainPanel 中使用 BorderLayout 并进行一些其他细微更改以获得所需的外观。检查这是否有帮助。

public class BorderWrapper {
    public static void main(String[] args) {
        // Create frame
        JFrame frame = new JFrame("Border Wrapper");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create main panel
        MainPanel panel = new MainPanel();
        frame.getContentPane().add(panel);

        // Display frame
        Dimension minSize = new Dimension(650, 375);
        frame.setPreferredSize(minSize);
        frame.setMinimumSize(minSize);
        frame.pack();
        frame.setVisible(true);
    }
}

class MainPanel extends JPanel {
    private static final Font INPUT_FONT = new Font("Monospaced", Font.PLAIN, 12);

    private JTextArea inputArea, outputArea;
    private JTextField titleField, topBorderField, sideBorderField;

    public MainPanel() {
        setLayout(new BorderLayout());

        // Set up config panel
        JPanel configPanel = new JPanel();
        configPanel.setLayout(new BoxLayout(configPanel, BoxLayout.X_AXIS));
        configPanel.setMaximumSize(new Dimension(400, 200));

        titleField = new JTextField(25);
        titleField.setFont(INPUT_FONT);
        topBorderField = new JTextField(1);
        topBorderField.setFont(INPUT_FONT);
        sideBorderField = new JTextField(4);
        sideBorderField.setFont(INPUT_FONT);

        configPanel.add(new JLabel("Title:"));
        configPanel.add(titleField);
        configPanel.add(new JLabel("Top border:"));
        configPanel.add(topBorderField);
        configPanel.add(new JLabel("Side border:"));
        configPanel.add(sideBorderField);

        add(configPanel, BorderLayout.NORTH);

        // Set up Input panel
        JPanel lowerPanel = new JPanel(new GridLayout(1, 1));
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.Y_AXIS));
        inputArea = new JTextArea("Type or paste your stuff here . . .");
        inputArea.setFont(INPUT_FONT);
        inputArea.setLineWrap(true);
        inputArea.setWrapStyleWord(true);
        inputArea.setColumns(75);
        JScrollPane inputPane = new JScrollPane(inputArea);

        JLabel inputLabel = new JLabel("Text Box");
        inputLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        inputPanel.add(inputLabel);
        inputPanel.add(inputPane);

        lowerPanel.add(inputPanel);

        // Set up Output panel
        JPanel outputPanel = new JPanel();
        outputPanel.setLayout(new BoxLayout(outputPanel, BoxLayout.Y_AXIS));
        outputArea = new JTextArea();
        outputArea.setFont(INPUT_FONT);
        outputArea.setLineWrap(true);
        outputArea.setWrapStyleWord(true);
        outputArea.setColumns(75);
        JScrollPane outputPane = new JScrollPane(outputArea);

        JLabel outputLabel = new JLabel("Wrapped Output");
        outputLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        outputPanel.add(outputLabel);
        outputPanel.add(outputPane);

        lowerPanel.add(outputPanel);
        add(lowerPanel, BorderLayout.CENTER);
    }
}

enter image description here

我觉得使用这种格式的 BorderLayout 很方便。无论如何,您仍然可以对使用 GridBagConstraints 发布的代码进行一些更改以获得所需的外观。一一进行以下更改,您将观察到差异。

1.您使用 BorderLayout 将 MainPanel 与北对齐。但在您的情况下,整个组件集都放置在 MainPanel 中,因此最好将其放置在中心。因此,不要使用下面的 NORTH :(在此更改后,您将看到完整的输入和输出面板)

MainPanel panel = new MainPanel();
        frame.getContentPane().add(panel, BorderLayout.CENTER);

2.您已将Parent框架的尺寸设置为Dimension(height=375)

minSize = new Dimension(650, 375);

您的组件(configPanel=200,outputPanel=400)组合高度超过375。将Parent的高度增加到大约600。

3.尝试使用 GridLayout 作为 configPanel,而不是 BoxLayout。

configPanel.setLayout(new GridLayout(1,6,5,0));

对现有代码进行上述 3 项更改将获得预期的输出。希望这一点能够澄清。

关于java - GridBagLayout 格式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36706195/

相关文章:

java - Spring Boot + Elastic Search +排除类字段

java - 没有 print 语句的代码不执行

Java Swing,如何使用鼠标调整 JPanel 的大小?

c++ - 为什么在 Windows 上由于 vector 删除而调用标量删除析构函数?

java - 具有默认安全性的 Spring Security 为 PUT 提供 401,为 GET 提供 200

java - 使用 CallVoidMethod 将 mat 数组从 native 代码传递到 java 代码

java - 显示图像

javascript - 如何使用 Source Maps 在 Chrome 调试器中黑箱文件?

visual-studio-2010 - 在 Visual Studio 2010 上调试时 IIS 超时

java - 如何将二维数组的一行或一列传递给java中的函数