英文:
What 'no such child' means in java swing when trying to makeCompactGrid with class SpringUtilities
问题
我试图制作一个简单的Java Swing程序,我没有完成这个程序,但在做功能部分之前我想看看它的外观,这是我的代码:
```java
import layouts.SpringUtilities;
import javax.swing.*;
import layouts.SpringUtilities;
public class FactorialCalculatorFrame extends JFrame {
public FactorialCalculatorFrame(){
JPanel panel = new JPanel();
panel.setLayout(new SpringLayout());
JTextField brojText = new JTextField();
brojText.setColumns(10);
panel.add(new JLabel("Broj:", SwingConstants.RIGHT));
panel.add(brojText);
JButton start = new JButton("Start");
panel.add(new JLabel("Pokreni izracun:", SwingConstants.RIGHT));
panel.add(start);
JProgressBar napredakProgressBar = new JProgressBar();
add(new JLabel("Napredak:", SwingConstants.RIGHT));
add(napredakProgressBar);
JLabel rezultat = new JLabel("Rezultat:");
JLabel ispisiRez = new JLabel("");
add(new JLabel("Rezultat:", SwingConstants.RIGHT));
add(ispisiRez);
start.addActionListener((e) -> {
try {
int number = Integer.parseInt(brojText.getText());
//reset GUI components
napredakProgressBar.setValue(0);
start.setEnabled(false);
ispisiRez.setText("");
//schedule for execution on one of working threads
new primeNumberJavaSwingApp().execute();
} catch (Exception ex) {
ex.printStackTrace();
}
});
SpringUtilities.makeCompactGrid(panel, 4, 2, 0, 0, 5, 5);
add(panel);
}
public static void main(String[] args){
FactorialCalculatorFrame frame = new FactorialCalculatorFrame();
frame.setVisible(true);
}
public class primeNumberJavaSwingApp extends SwingWorker<Long, Integer> {
@Override
protected Long doInBackground() throws Exception {
Long l = (long)3.2;
return l;
}
}
}
发生的异常是:在线程 "main" 中的异常 java.lang.ArrayIndexOutOfBoundsException: 没有这样的子项:4
位于 layouts.SpringUtilities.makeCompactGrid(SpringUtilities.java:190)
位于 FactorialCalculatorFrame.<init>(FactorialCalculatorFrame.java:55)
为什么会发生这种情况?我做错了什么?
我还使用了从Oracle复制的SpringUtilities类。非常感谢任何帮助!
<details>
<summary>英文:</summary>
So I tried to make a simple java swing program, i didn't finish the program but I wanted to see how it looks before doing the functionality part, this is my code:
import layouts.SpringUtilities;
import javax.swing.*;
import layouts.SpringUtilities;
public class FactorialCalculatorFrame extends JFrame {
public FactorialCalculatorFrame(){
JPanel panel = new JPanel();
panel.setLayout(new SpringLayout());
JTextField brojText = new JTextField();
brojText.setColumns(10);
panel.add(new JLabel("Broj:", SwingConstants.RIGHT));
panel.add(brojText);
JButton start = new JButton("Start");
panel.add(new JLabel("Pokreni izracun:",SwingConstants.RIGHT));
panel.add(start);
JProgressBar napredakProgressBar = new JProgressBar();
add(new JLabel("Napredak:", SwingConstants.RIGHT));
add(napredakProgressBar);
JLabel rezultat = new JLabel("Rezultat:");
JLabel ispisiRez = new JLabel("");
add(new JLabel("Rezultat:", SwingConstants.RIGHT));
add(ispisiRez);
start.addActionListener((e)->{
try {
int number = Integer.parseInt(brojText.getText());
//reset GUI components
napredakProgressBar.setValue(0);
start.setEnabled(false);
ispisiRez.setText("");
//schedule for execution on one of working threads
new primeNumberJavaSwingApp().execute();
} catch (Exception ex) {
ex.printStackTrace();
}
});
SpringUtilities.makeCompactGrid(panel,4, 2, 0, 0, 5, 5);
add(panel);
}
public static void main(String[] args){
FactorialCalculatorFrame frame = new FactorialCalculatorFrame();
frame.setVisible(true);
}
public class primeNumberJavaSwingApp extends SwingWorker<Long, Integer> {
@Override
protected Long doInBackground() throws Exception {
Long l = (long)3.2;
return l;}}}
the Exception that occurs is this Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: No such child: 4
at layouts.SpringUtilities.makeCompactGrid(SpringUtilities.java:190)
at FactorialCalculatorFrame.<init>(FactorialCalculatorFrame.java:55)
Why does this occurs, what did I do wrong?
I also use SpringUtilities class that I copied from Oracle.
Any help is greatly appriciated!
</details>
# 答案1
**得分**: 0
我从[这里][1]下载了`SpringUtilities`类的源代码。
你的问题在于你没有将所有的组件添加到`panel`中。你在应该调用`panel.add()`时调用了`add()`。因此,你只向`panel`中添加了4个组件,而不是8个。这也是错误的原因。
我还在`JFrame`类的`pack()`方法中添加了一个调用,以便使`JFrame`的大小足够大,以显示其中包含的所有组件。
以下是已经修复的代码:
```java
import layout.SpringUtilities;
import javax.swing.*;
public class FactorialCalculatorFrame extends JFrame {
public FactorialCalculatorFrame() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new SpringLayout());
JTextField brojText = new JTextField();
brojText.setColumns(10);
panel.add(new JLabel("Broj:", SwingConstants.RIGHT));
panel.add(brojText);
JButton start = new JButton("Start");
panel.add(new JLabel("Pokreni izracun:",SwingConstants.RIGHT));
panel.add(start);
JProgressBar napredakProgressBar = new JProgressBar();
panel.add(new JLabel("Napredak:", SwingConstants.RIGHT));
panel.add(napredakProgressBar);
JLabel rezultat = new JLabel("Rezultat:");
JLabel ispisiRez = new JLabel("");
panel.add(new JLabel("Rezultat:", SwingConstants.RIGHT));
panel.add(ispisiRez);
start.addActionListener((e) -> {
try {
int number = Integer.parseInt(brojText.getText());
//reset GUI components
napredakProgressBar.setValue(0);
start.setEnabled(false);
ispisiRez.setText("");
//schedule for execution on one of working threads
new primeNumberJavaSwingApp().execute();
} catch (Exception ex) {
ex.printStackTrace();
}
});
SpringUtilities.makeCompactGrid(panel, 4, 2, 0, 0, 5, 5);
add(panel);
}
public static void main(String[] args){
FactorialCalculatorFrame frame = new FactorialCalculatorFrame();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public class primeNumberJavaSwingApp extends SwingWorker<Long, Integer> {
@Override
protected Long doInBackground() throws Exception {
Long l = (long) 3.2;
return l;
}
}
}
英文:
I downloaded source code for class SpringUtilities
from here.
Your problem is that you are not adding all the components to the panel
. You are calling add()
when you should be calling panel.add()
. Hence you are only adding 4 components to panel
rather than 8. Hence the error message.
I also added a call to method pack()
, of class JFrame
, in order to make the JFrame
big enough to display all the components it contains.
Here is your code with my fixes:
import layout.SpringUtilities; // in your code this import is added twice
import javax.swing.*;
public class FactorialCalculatorFrame extends JFrame {
public FactorialCalculatorFrame() {
setDefaultCloseOperation(EXIT_ON_CLOSE); // I added this line
JPanel panel = new JPanel();
panel.setLayout(new SpringLayout());
JTextField brojText = new JTextField();
brojText.setColumns(10);
panel.add(new JLabel("Broj:", SwingConstants.RIGHT));
panel.add(brojText);
JButton start = new JButton("Start");
panel.add(new JLabel("Pokreni izracun:",SwingConstants.RIGHT));
panel.add(start);
JProgressBar napredakProgressBar = new JProgressBar();
panel.add(new JLabel("Napredak:", SwingConstants.RIGHT)); // change here
panel.add(napredakProgressBar); // change here
JLabel rezultat = new JLabel("Rezultat:");
JLabel ispisiRez = new JLabel("");
panel.add(new JLabel("Rezultat:", SwingConstants.RIGHT));
panel.add(ispisiRez);
start.addActionListener((e)->{
try {
int number = Integer.parseInt(brojText.getText());
//reset GUI components
napredakProgressBar.setValue(0);
start.setEnabled(false);
ispisiRez.setText("");
//schedule for execution on one of working threads
new primeNumberJavaSwingApp().execute();
} catch (Exception ex) {
ex.printStackTrace();
}
});
SpringUtilities.makeCompactGrid(panel, 4, 2, 0, 0, 5, 5);
add(panel);
}
public static void main(String[] args){
FactorialCalculatorFrame frame = new FactorialCalculatorFrame();
frame.pack(); // I added this line
frame.setLocationRelativeTo(null); // I added this line
frame.setVisible(true);
}
public class primeNumberJavaSwingApp extends SwingWorker<Long, Integer> {
@Override
protected Long doInBackground() throws Exception {
Long l = (long) 3.2;
return l;
}
}
}
Here is a screen capture of the JFrame
when running the above code.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论