在 java GridBagLayout 中定位组件
Positioning components in java GridBagLayout
我是 Java 的新手,我正在制作一个应用程序来帮助我估算建筑成本。我为它构建了后端,但按钮和文本字段都排成一排,这使得应用程序太宽了,无法适应我的屏幕。我现在正在尝试使用 3x6 网格包布局来组织组件,如下所示:
Title
question1 *answer*
question2 *answer*
question3 *answer*
question4 *answer*
--Calculate--
Estimate: $***
当我运行程序时,我得到一个“非法组件位置”
错误(粘贴在底部)并且不再弹出任何内容
我开始添加网格约束。问题不在于 JButton 或其动作侦听器。这是代码,对不起
缺少评论:
import java.util.*;
import packagepackage.HintTextFieldUI;
import java.awt.*;
import java.awt.event.*;
import java.security.PublicKey;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public class CP_GUI extends JFrame {
public JLabel tLabel;
public JTextField linear;
public JLabel liLabel;
public JComboBox<String> sump;
public JLabel suLabel;
public JComboBox<String> elec;
public JLabel elLabel;
public JTextField prep;
public JLabel prLabel;
public JTextField estimate;
public JLabel esLabel;
public CP_GUI() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(200, 200, 100, 100));
GridBagConstraints c = new GridBagConstraints();
String title = "Drain Tile Calculator";
tLabel = new JLabel(title);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.ipady = 40;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 0;
panel.add(tLabel, c);
frame.setTitle(title);
liLabel = new JLabel("Basement Perimeter Length");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 1;
c.gridy = 0;
panel.add(liLabel, c);
linear = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 1;
c.gridy = 0;
panel.add(linear, c);
prLabel = new JLabel("Time needed to prepare site:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 2;
c.gridy = 0;
panel.add(prLabel, c);
prep = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 2;
c.gridy = 2;
panel.add(prep, c);
suLabel = new JLabel("Using:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 3;
c.gridy = 0;
panel.add(suLabel, c);
String[] sumpo = {"New sump pump","Existing sump pump"};
sump = new JComboBox<>(sumpo);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 3;
c.gridy = 2;
panel.add(sump, c);
elLabel = new JLabel("Location of electrical outlet:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 4;
c.gridy = 0;
panel.add(elLabel, c);
String[] electo = {"There is no outlet within 6 feet of the sump pump","There is an outlet nearby, or I do not need a new pump"};
elec = new JComboBox<>(electo);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 4;
c.gridy = 2;
panel.add(elec, c);
estimate = new JTextField(10);
JButton calculate = new JButton("Calculate");
calculate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
// TODO Auto-generated method stub
Integer linVar = Integer.parseInt(linear.getText());
linVar *= 13;
Object sumps = sump.getSelectedItem();
Integer sumpVar = 0;
if("New sump pump".equals(sumps)) {
sumpVar += 260;}
Object elecs = elec.getSelectedItem();
Integer elecsVar = 0;
if("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
elecsVar += 280;}
Integer prepsVar = Integer.parseInt(prep.getText());
prepsVar += 30;
prepsVar *= 235;
prepsVar /= 100;
linVar += sumpVar += elecsVar += prepsVar;
/* overhead*/
linVar += 2428;
/* tax */
linVar *= 11;
linVar /= 10;
/* margin */
linVar *= 12;
linVar /= 10;
String toWords = String.valueOf(linVar);
estimate.setUI(new HintTextFieldUI(toWords, true));
}
});
c.fill = GridBagConstraints.HORIZONTAL;
c.ipady = 40;
c.weightx = 0.5;
c.gridwidth = 3;
c.gridx = 5;
c.gridy = 0;
panel.add(calculate, c);
esLabel = new JLabel("Estimated Cost:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridwidth = 2;
c.gridx = 6;
c.gridy = 0;
panel.add(esLabel, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 6;
c.gridy = 2;
panel.add(estimate, c);
frame.add(panel, GridBagConstraints.CENTER);
frame.pack();
frame.setVisible(true);
linear.setUI(new HintTextFieldUI("Perimeter length", true));
prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
}
public static void main(String[] args) {
new CP_GUI();
}
}
我怀疑这个问题可能与大小有关
网格本身 (3x6) 从未定义,或与框架的布局
未正确设置网格包布局。
错误:
Exception in thread "main" java.lang.IllegalArgumentException: illegal component position
at java.desktop/java.awt.Container.addImpl(Container.java:1115)
at java.desktop/java.awt.Container.add(Container.java:1033)
at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:554)
at java.desktop/java.awt.Container.add(Container.java:493)
at craftsmanPeak/packagepackage.CP_GUI.<init>(CP_GUI.java:163)
at craftsmanPeak/packagepackage.CP_GUI.main(CP_GUI.java:173)
非常感谢!非常感谢!
frame.add(panel, GridBagConstraints.CENTER);
JFrame
默认使用 BorderLayout
,去掉 GridBagConstraints.CENTER
我也清理了你的布局(相信我(网上一些陌生人说的),那是一团糟)
你弄乱了 x
和 y
的位置
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public JLabel tLabel;
public JTextField linear;
public JLabel liLabel;
public JComboBox<String> sump;
public JLabel suLabel;
public JComboBox<String> elec;
public JLabel elLabel;
public JTextField prep;
public JLabel prLabel;
public JTextField estimate;
public JLabel esLabel;
public TestPane() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createEmptyBorder(16, 16, 16, 16));
GridBagConstraints c = new GridBagConstraints();
String title = "Drain Tile Calculator";
tLabel = new JLabel(title, JLabel.CENTER);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.ipady = 40;
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.CENTER;
c.gridx = 0;
c.gridy = 0;
add(tLabel, c);
c = new GridBagConstraints();
c.anchor = GridBagConstraints.LINE_END;
c.gridy = 1;
c.gridx = 0;
liLabel = new JLabel("Basement Perimeter Length:");
prLabel = new JLabel("Time needed to prepare site:");
suLabel = new JLabel("Using:");
elLabel = new JLabel("Location of electrical outlet:");
add(liLabel, c);
c.gridy++;
add(prLabel, c);
c.gridy++;
add(suLabel, c);
c.gridy++;
add(elLabel, c);
linear = new JTextField(10);
prep = new JTextField(10);
String[] sumpo = {"New sump pump", "Existing sump pump"};
sump = new JComboBox<>(sumpo);
String[] electo = {"There is no outlet within 6 feet of the sump pump", "There is an outlet nearby, or I do not need a new pump"};
elec = new JComboBox<>(electo);
c.anchor = GridBagConstraints.LINE_START;
c.gridx++;
c.gridy = 1;
add(linear, c);
c.gridy++;
add(prep, c);
c.gridy++;
add(sump, c);
c.gridy++;
add(elec, c);
JButton calculate = new JButton("Calculate");
//// calculate.addActionListener(new ActionListener() {
//// public void actionPerformed(ActionEvent event) {
//// // TODO Auto-generated method stub
//// Integer linVar = Integer.parseInt(linear.getText());
//// linVar *= 13;
////
//// Object sumps = sump.getSelectedItem();
//// Integer sumpVar = 0;
//// if ("New sump pump".equals(sumps)) {
//// sumpVar += 260;
//// }
////
//// Object elecs = elec.getSelectedItem();
//// Integer elecsVar = 0;
//// if ("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
//// elecsVar += 280;
//// }
////
//// Integer prepsVar = Integer.parseInt(prep.getText());
//// prepsVar += 30;
//// prepsVar *= 235;
//// prepsVar /= 100;
////
//// linVar += sumpVar += elecsVar += prepsVar;
//// /* overhead*/
//// linVar += 2428;
//// /* tax */
//// linVar *= 11;
//// linVar /= 10;
//// /* margin */
//// linVar *= 12;
//// linVar /= 10;
//// String toWords = String.valueOf(linVar);
////
//// estimate.setUI(new HintTextFieldUI(toWords, true));
//// }
////
//// });
c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(10, 0, 10, 0);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridx = 0;
c.gridy = 5;
add(calculate, c);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 6;
c.anchor = GridBagConstraints.LINE_END;
esLabel = new JLabel("Estimated Cost:");
estimate = new JTextField(10);
add(esLabel, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
add(estimate, c);
// linear.setUI(new HintTextFieldUI("Perimeter length", true));
// prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
}
}
}
我是 Java 的新手,我正在制作一个应用程序来帮助我估算建筑成本。我为它构建了后端,但按钮和文本字段都排成一排,这使得应用程序太宽了,无法适应我的屏幕。我现在正在尝试使用 3x6 网格包布局来组织组件,如下所示:
Title
question1 *answer*
question2 *answer*
question3 *answer*
question4 *answer*
--Calculate--
Estimate: $***
当我运行程序时,我得到一个“非法组件位置” 错误(粘贴在底部)并且不再弹出任何内容 我开始添加网格约束。问题不在于 JButton 或其动作侦听器。这是代码,对不起 缺少评论:
import java.util.*;
import packagepackage.HintTextFieldUI;
import java.awt.*;
import java.awt.event.*;
import java.security.PublicKey;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public class CP_GUI extends JFrame {
public JLabel tLabel;
public JTextField linear;
public JLabel liLabel;
public JComboBox<String> sump;
public JLabel suLabel;
public JComboBox<String> elec;
public JLabel elLabel;
public JTextField prep;
public JLabel prLabel;
public JTextField estimate;
public JLabel esLabel;
public CP_GUI() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(200, 200, 100, 100));
GridBagConstraints c = new GridBagConstraints();
String title = "Drain Tile Calculator";
tLabel = new JLabel(title);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.ipady = 40;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 0;
panel.add(tLabel, c);
frame.setTitle(title);
liLabel = new JLabel("Basement Perimeter Length");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 1;
c.gridy = 0;
panel.add(liLabel, c);
linear = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 1;
c.gridy = 0;
panel.add(linear, c);
prLabel = new JLabel("Time needed to prepare site:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 2;
c.gridy = 0;
panel.add(prLabel, c);
prep = new JTextField(10);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 2;
c.gridy = 2;
panel.add(prep, c);
suLabel = new JLabel("Using:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 3;
c.gridy = 0;
panel.add(suLabel, c);
String[] sumpo = {"New sump pump","Existing sump pump"};
sump = new JComboBox<>(sumpo);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 3;
c.gridy = 2;
panel.add(sump, c);
elLabel = new JLabel("Location of electrical outlet:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 4;
c.gridy = 0;
panel.add(elLabel, c);
String[] electo = {"There is no outlet within 6 feet of the sump pump","There is an outlet nearby, or I do not need a new pump"};
elec = new JComboBox<>(electo);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 4;
c.gridy = 2;
panel.add(elec, c);
estimate = new JTextField(10);
JButton calculate = new JButton("Calculate");
calculate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
// TODO Auto-generated method stub
Integer linVar = Integer.parseInt(linear.getText());
linVar *= 13;
Object sumps = sump.getSelectedItem();
Integer sumpVar = 0;
if("New sump pump".equals(sumps)) {
sumpVar += 260;}
Object elecs = elec.getSelectedItem();
Integer elecsVar = 0;
if("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
elecsVar += 280;}
Integer prepsVar = Integer.parseInt(prep.getText());
prepsVar += 30;
prepsVar *= 235;
prepsVar /= 100;
linVar += sumpVar += elecsVar += prepsVar;
/* overhead*/
linVar += 2428;
/* tax */
linVar *= 11;
linVar /= 10;
/* margin */
linVar *= 12;
linVar /= 10;
String toWords = String.valueOf(linVar);
estimate.setUI(new HintTextFieldUI(toWords, true));
}
});
c.fill = GridBagConstraints.HORIZONTAL;
c.ipady = 40;
c.weightx = 0.5;
c.gridwidth = 3;
c.gridx = 5;
c.gridy = 0;
panel.add(calculate, c);
esLabel = new JLabel("Estimated Cost:");
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridwidth = 2;
c.gridx = 6;
c.gridy = 0;
panel.add(esLabel, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 6;
c.gridy = 2;
panel.add(estimate, c);
frame.add(panel, GridBagConstraints.CENTER);
frame.pack();
frame.setVisible(true);
linear.setUI(new HintTextFieldUI("Perimeter length", true));
prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
}
public static void main(String[] args) {
new CP_GUI();
}
}
我怀疑这个问题可能与大小有关 网格本身 (3x6) 从未定义,或与框架的布局 未正确设置网格包布局。
错误:
Exception in thread "main" java.lang.IllegalArgumentException: illegal component position
at java.desktop/java.awt.Container.addImpl(Container.java:1115)
at java.desktop/java.awt.Container.add(Container.java:1033)
at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:554)
at java.desktop/java.awt.Container.add(Container.java:493)
at craftsmanPeak/packagepackage.CP_GUI.<init>(CP_GUI.java:163)
at craftsmanPeak/packagepackage.CP_GUI.main(CP_GUI.java:173)
非常感谢!非常感谢!
frame.add(panel, GridBagConstraints.CENTER);
JFrame
默认使用 BorderLayout
,去掉 GridBagConstraints.CENTER
我也清理了你的布局(相信我(网上一些陌生人说的),那是一团糟)
你弄乱了 x
和 y
的位置
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public JLabel tLabel;
public JTextField linear;
public JLabel liLabel;
public JComboBox<String> sump;
public JLabel suLabel;
public JComboBox<String> elec;
public JLabel elLabel;
public JTextField prep;
public JLabel prLabel;
public JTextField estimate;
public JLabel esLabel;
public TestPane() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createEmptyBorder(16, 16, 16, 16));
GridBagConstraints c = new GridBagConstraints();
String title = "Drain Tile Calculator";
tLabel = new JLabel(title, JLabel.CENTER);
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.ipady = 40;
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.CENTER;
c.gridx = 0;
c.gridy = 0;
add(tLabel, c);
c = new GridBagConstraints();
c.anchor = GridBagConstraints.LINE_END;
c.gridy = 1;
c.gridx = 0;
liLabel = new JLabel("Basement Perimeter Length:");
prLabel = new JLabel("Time needed to prepare site:");
suLabel = new JLabel("Using:");
elLabel = new JLabel("Location of electrical outlet:");
add(liLabel, c);
c.gridy++;
add(prLabel, c);
c.gridy++;
add(suLabel, c);
c.gridy++;
add(elLabel, c);
linear = new JTextField(10);
prep = new JTextField(10);
String[] sumpo = {"New sump pump", "Existing sump pump"};
sump = new JComboBox<>(sumpo);
String[] electo = {"There is no outlet within 6 feet of the sump pump", "There is an outlet nearby, or I do not need a new pump"};
elec = new JComboBox<>(electo);
c.anchor = GridBagConstraints.LINE_START;
c.gridx++;
c.gridy = 1;
add(linear, c);
c.gridy++;
add(prep, c);
c.gridy++;
add(sump, c);
c.gridy++;
add(elec, c);
JButton calculate = new JButton("Calculate");
//// calculate.addActionListener(new ActionListener() {
//// public void actionPerformed(ActionEvent event) {
//// // TODO Auto-generated method stub
//// Integer linVar = Integer.parseInt(linear.getText());
//// linVar *= 13;
////
//// Object sumps = sump.getSelectedItem();
//// Integer sumpVar = 0;
//// if ("New sump pump".equals(sumps)) {
//// sumpVar += 260;
//// }
////
//// Object elecs = elec.getSelectedItem();
//// Integer elecsVar = 0;
//// if ("There is no outlet within 6 feet of the sump pump".equals(elecs)) {
//// elecsVar += 280;
//// }
////
//// Integer prepsVar = Integer.parseInt(prep.getText());
//// prepsVar += 30;
//// prepsVar *= 235;
//// prepsVar /= 100;
////
//// linVar += sumpVar += elecsVar += prepsVar;
//// /* overhead*/
//// linVar += 2428;
//// /* tax */
//// linVar *= 11;
//// linVar /= 10;
//// /* margin */
//// linVar *= 12;
//// linVar /= 10;
//// String toWords = String.valueOf(linVar);
////
//// estimate.setUI(new HintTextFieldUI(toWords, true));
//// }
////
//// });
c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(10, 0, 10, 0);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridx = 0;
c.gridy = 5;
add(calculate, c);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 6;
c.anchor = GridBagConstraints.LINE_END;
esLabel = new JLabel("Estimated Cost:");
estimate = new JTextField(10);
add(esLabel, c);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
add(estimate, c);
// linear.setUI(new HintTextFieldUI("Perimeter length", true));
// prep.setUI(new HintTextFieldUI("Minutes of preptime", true));
}
}
}