我對 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)
非常感謝!對此,我真的非常感激!
uj5u.com熱心網友回復:
frame.add(panel, GridBagConstraints.CENTER); JFrameBorderLayout默認使用 a ,去掉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));
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372473.html
上一篇:在JTable上顯示輸入
