IllegalArgumentException

Status
Nicht offen für weitere Antworten.

Antoras

Top Contributor
Hallo,

ich bekomme beim Kompilieren meines JPanels immer eine IllegalArgumentException:
Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
at java.awt.Container.addImpl(Container.java:1022)
at java.awt.Container.add(Container.java:935)
at javax.swing.JFrame.addImpl(JFrame.java:545)
at java.awt.Container.add(Container.java:352)
at Sudoku.<init>(Sudoku.java:39)
at Sudoku.main(Sudoku.java:25)
Kenn mich mit der Fehlermeldung aber nicht aus. Kann mir jemand sagen was dem Compiler nicht gefällt?
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Sudoku extends JFrame{
	private int x = 3;
	private int y = 3;
	
	private JTextField[][] jTextField;
	private JPanel jPanel;
	private JButton jButton;
	private JFrame jFrame;
	
	public static void main(String[] args) {
		new Sudoku (200, 200);
	}
	
	/**
	 * 
	 * @param w
	 * @param h
	 */
	public Sudoku(int w, int h) {
		this.setPreferredSize(new Dimension(w, h));
//		this.setBackground(Color.cyan);
		jFrame = new JFrame("Sudoku");
//		jFrame.setLocation(300, 300);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.add(this);
		jFrame.pack();
		jFrame.setVisible(true);
		
		GUI();
	}
	
	/**
	 * grafische Oberflaeche
	 */	
	public void GUI() {
		setLayout(new BorderLayout());
		
		jPanel = new JPanel(new FlowLayout());
		jButton = new JButton("Neu");
		jButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				neu();
			}
		});
		jPanel.add(jButton);
		
		jButton = new JButton("Erstellen");
		jButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				erstellen();
			}
		});
		jPanel.add(jButton);
		add(jPanel, BorderLayout.NORTH);
		
		jTextField = new JTextField[x][y];
		jPanel = new JPanel(new GridLayout(x, y));
		
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				jTextField[i][j] = new JTextField();
				jPanel.add(jTextField[i][j]);
			}
		}
		add(jPanel, BorderLayout.CENTER);		
		
		
	}
	
	public void neu() {
		
	}
	
	public void erstellen() {
		
	}
	
}
 

Der Müde Joe

Top Contributor
>java.lang.IllegalArgumentException: adding a window to a container

Kannst kein JFrame einem JFrame adden

und es meckert nicht der Compiler sonder es ist eine
RuntimeException
 

Antoras

Top Contributor
Achso ok. Jetzt geht es.

Danke dir.

Aber ich hab schon ein neues Problem: Meine Textfelder werden nicht gezeichnet. Woran könnte das liegen?

In diesen beiden Schleifen werden die TF erzeugt:
Code:
for (int i = 0; i < x; i++) {
					for (int j = 0; j < y; j++) {
						jTextField[i][j] = new JTextField();
						jPanel.add(jTextField[i][j]);
					}
				}
Nochmal die ganze Klasse:
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Sudoku extends JPanel{
	private int x = 3;
	private int y = 3;	
	private int zahlen[][];
	private int counter = 1;
	
	private JTextField[][] jTextField;
	private JPanel jPanel;
	private JButton jButton;
	private JFrame jFrame;
	
	public static void main(String[] args) {
		new Sudoku (200, 200);
	}
	
	/**
	 * 
	 * @param w
	 * @param h
	 */
	public Sudoku(int w, int h) {
		this.setPreferredSize(new Dimension(w, h));
//		this.setBackground(Color.cyan);
		jFrame = new JFrame("Sudoku");
//		jFrame.setLocation(300, 300);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.add(this);
		jFrame.pack();
		jFrame.setVisible(true);
		
		GUI();
	}
	
	/**
	 * grafische Oberflaeche
	 */	
	public void GUI() {
		setLayout(new BorderLayout());
		
		jPanel = new JPanel(new FlowLayout());
		jButton = new JButton("Neu");
		jButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				neu();
			}
		});
		jPanel.add(jButton);
		
		jButton = new JButton("Erstellen");
		jButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				erstellen();
			}
		});
		jPanel.add(jButton);
		add(jPanel, BorderLayout.NORTH);
		
		jTextField = new JTextField[x][y];
		jPanel = new JPanel(new GridLayout(x, y));				
		
//		for (int a = 0; a < x; a++) {
//			for (int b = 0; b < y; b++) {
				for (int i = 0; i < x; i++) {
					for (int j = 0; j < y; j++) {
						jTextField[i][j] = new JTextField();
						jPanel.add(jTextField[i][j]);
					}
				}
//			}
//		}
		add(jPanel, BorderLayout.CENTER);				
	}
	
	/**
	 * Textfelder mit Zahlen ausfüllen
	 */
	public void neu() {
		zahlen = new int[x][y];
		
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				zahlen[i][j] = ++counter;
				jTextField[i][j].setText(String.valueOf(zahlen[i][j]));
			}
		}		
	}
	
	/**
	 * Sudoku erstellen
	 */
	public void erstellen() {
		
	}
	
}
 

Der Müde Joe

Top Contributor
> jFrame.setVisible(true);
> GUI();

setVisible ist immer der letzte Aufruf! zuerst alles erstellen,
dann setVisible!

dann sollte es klappen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben