1. ホーム
  2. java

[解決済み] エラー: java.lang.IllegalArgumentException

2022-03-11 22:24:15

質問

以下のコードでエラーが発生します。 java.lang.IllegalArgumentException: adding container's parent to itself.

このようなコードです。

public class humev extends JFrame implements ActionListener{

    //Dichiarazione variabili e costanti

    private static final int larghezza = 1300;
    private static final int altezza = 1000;
    private static final String nome = "Human Evolution";

    private JLabel lab;
    private JButton gioca;
    private JPanel pang;

        public humev(){

            try{
                pang = new JPanel();
                gioca = new JButton("Gioca!");
                gioca.addActionListener(this);
                lab = new JLabel();

                gioca.add(gioca);
                lab.add(lab);
                pang.setLayout(null);
                }
            catch(Exception e1){
                System.err.println(e1);
                System.err.println("Impossibile caricare il frame di gioco!");
                }
        }

    public static void main(String[] args) {

        //Finestra
        try{
            humev h = new humev();

            JFrame finestra = new JFrame(nome);

            Dimension dim_finestra = new Dimension(larghezza, altezza);

            finestra.setPreferredSize(dim_finestra);
            finestra.setMaximumSize(dim_finestra);
            finestra.setResizable(false);
            finestra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            finestra.pack();
            finestra.setVisible(true);

        }
        catch(Exception e2){
            System.err.println(e2);
            System.err.println("Impossibile caricare la finestra. Frame non caricato");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == gioca){
            lab.setText("Gioco avviato con successo!");
        }
    }
}

解決方法は?

この例を実行してみてください。あなたのコードには問題がたくさんあります。

コンポーネントを自分自身に追加している

gioca.add(gioca); // don't do this

レイアウトを使用する。NULLは使用しない

pang.setLayout(null); // don't do this .use layouts .and even if you use null then
//use bounds to absolutely position .if you use null layout and if you add using `.add()` 
//then you will not see those components .

完全なコード

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class humev extends JFrame implements ActionListener {

    private static final int larghezza = 1300;
    private static final int altezza = 1000;
    private static final String nome = "Human Evolution";

    private final JLabel lab;
    private final JButton gioca;
    private final JPanel pang;

    public humev() {
        super(nome);

        pang = new JPanel();
        //pang.setLayout(new FlowLayout()); // use appropriate layout .for example flowlayout.since flowlayout is default layout for jpanel you can avoid it.but don't use null
        gioca = new JButton("Gioca!");
        gioca.addActionListener(this);
        lab = new JLabel("lable");

        pang.add(gioca);
        pang.add(lab);
        add(pang); // add pang panel to frame
        Dimension dim_finestra = new Dimension(larghezza, altezza);

        setPreferredSize(dim_finestra);
        setMaximumSize(dim_finestra);
        //setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true); 
        pack();

    }

    public static void main(String[] args) {
        humev humev = new humev();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == gioca) {
            lab.setText("Gioco avviato con successo!");
        }
    }
}