【问题标题】:Java Organized Grid LayoutJava 有组织的网格布局
【发布时间】:2012-01-29 17:35:32
【问题描述】:

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

如果用户输入 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);
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing grid-layout


【解决方案1】:

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

这可能应该是这样布局的。

ExcellentGUI.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();
            }
        });
    }
}

【讨论】:

  • 谢谢,现在看起来好多了!
  • 不客气。还有许多其他方法可以将它放在基本布局中,这只是一种简单的方法。不要忘记有关 SSCCE 的建议。如果我从可编译代码开始,我本可以更快地提交该答案。 ;)
  • @AndrewThompson 您先生,您的空闲时间太多了,或者对布局管理器有非常详尽的了解。为这个答案 +1
  • @Robin(摇摆手)每个大约是 50/50。 ;)
【解决方案2】:

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

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

【讨论】:

  • 谢谢你这样做了。有什么办法可以缩小东西的尺寸,还是必须根据框架尺寸来确定?
  • 在框架上致电pack()。我现在正在重新设计整个 GUI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多