我正在创建一个程序,要求用户输入一个整数,然后它应该显示一个这样的新窗口,具体取决于整数的大小。
如果用户输入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);
}
答案 0 :(得分:4)
这个GUI真正需要的是一个完全不同的布局。以下是您计划的GUI的外观。
这是应该如何制定的。
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();
}
});
}
}
答案 1 :(得分:2)
您了解此new GridLayout(2, testCount)
表示两行和testCount列,这不是我想要的。我强烈建议您阅读GridLayout API,以确切了解这个和其他构造函数的工作原理。
您可以通过制作布局new GridLayout(0, 2);
(这意味着任意数量的行并且总是2列)来大大简化事情。