0

我正在制作一个向用户请求整数的程序,然后它应该根据整数的大小显示一个像这样的新窗口。

如果用户输入 2,这将是布局:

Enter test score:    JTextField over here
Enter test score:    JTextField over here
Reset             Submit

出于某种原因,我无法使 java 中的网格布局每行只有 2 列。

这是我的代码:

public void createAverageGUI()
{
    averageFrame = new JFrame("Get All Test Scores");
    txtAllAverages = new JTextField[testCount];
    averageFrame.setLayout(new GridLayout(2, testCount));
    for (int i = 0; i < testCount; i++)
    {
        averageFrame.add(new JLabel("Enter test score: "));
        JTextField field = new JTextField(10);
        averageFrame.add(field);
        txtAllAverages[i] = field;
    }
    averageFrame.add(resetAverages);
    averageFrame.add(submitAverages);
    averageFrame.setSize(400, 600);
    averageFrame.setVisible(true);
}
4

2 回答 2

4

这个 GUI 真正需要的是完全不同的布局。这是您计划的 GUI 的外观。

在此处输入图像描述

以下是它可能应该如何布置的方式。

在此处输入图像描述

优秀的GUI.java

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

class ExcellentGUI {

    private JTextField[] txtAllAverages;
    int testCount = 2;

    public void createAverageGUI()
    {
        txtAllAverages = new JTextField[testCount];

        JPanel inputControls = new JPanel(new BorderLayout(5,5));

        JPanel inputControlsLabels = new JPanel(new GridLayout(0,1,3,3));
        JPanel inputControlsFields = new JPanel(new GridLayout(0,1,3,3));
        inputControls.add(inputControlsLabels, BorderLayout.WEST);
        inputControls.add(inputControlsFields, BorderLayout.CENTER);
        for (int i = 0; i < testCount; i++)
        {
            inputControlsLabels.add(new JLabel("Test score: "));
            JTextField field = new JTextField(10);
            inputControlsFields.add(field);
            txtAllAverages[i] = field;
        }

        JPanel controls = new JPanel(new FlowLayout(FlowLayout.CENTER,5,2));

        controls.add(new JButton("Reset"));
        controls.add(new JButton("Submit"));

        JPanel gui = new JPanel(new BorderLayout(10,10));
        gui.setBorder(new TitledBorder("Averages"));
        gui.add(inputControls, BorderLayout.CENTER);
        gui.add(controls, BorderLayout.SOUTH);

        JFrame averageFrame = new JFrame("Get All Test Scores");
        averageFrame.setContentPane(gui);
        // let the components assume the natural size
        // averageFrame.setSize(400, 600);
        averageFrame.pack();
        averageFrame.setLocationByPlatform(true);
        averageFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        averageFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ExcellentGUI().createAverageGUI();
            }
        });
    }
}
于 2012-01-29T06:05:30.450 回答
2

你明白这new GridLayout(2, testCount)意味着两行和 testCount 列,这不是我认为你想要的。我强烈建议您阅读 GridLayout API 以准确了解此构造函数和其他构造函数的工作原理。

您可以通过使您的布局大大简化事情,new GridLayout(0, 2);这意味着任意数量的行和始终 2 列。

于 2012-01-29T05:29:44.233 回答