尝试使用类SpringUtilities进行makeCompactGrid时,java swing中的'no such child'意味着什么

所以我尝试制作一个简单的java swing程序,但我没有完成该程序,但是我想在做功能部分之前先看一下它的外观,这是我的代码:

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,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)

为什么会这样,我做错了什么?

我还使用从Oracle复制的SpringUtilities类。 任何帮助都非常有用!

iCMS 回答:尝试使用类SpringUtilities进行makeCompactGrid时,java swing中的'no such child'意味着什么

我从here下载了类SpringUtilities的源代码。

您的问题是您没有将所有组件都添加到panel中。当您应该致电add()时,您正在致电panel.add()。因此,您只向panel添加了4个组件,而不是8个。因此,出现了错误消息。

我还添加了对类pack()的方法JFrame的调用,以使JFrame足够大以显示其包含的所有组件。

以下是我的修正代码:

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,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;
        }
    }
}

这是运行上述代码时JFrame的屏幕截图。

enter image description here

本文链接:https://www.f2er.com/1868061.html

大家都在问