# zweidimensionales Buttonarray auf Panel



## BrunoT (8. Mai 2014)

Hallo zusammen,

ich möchte auf einem Panel ein zweidimensionales Array aus Button erzeugen aber mit absolutem Layout.
Dies funktioniert auf einem Frame sofort, aber auf einem Panel erzeugt die add Methode Fehler.


```
private JFrame frame;
	private JPanel panel;
	private JButton button[][]; // Buttonarray
	private int maxbreite = 9, maxhoehe = 9;

...

	protected void Aufbau_Spielfeld() {
		// TODO Auto-generated method stub

		button = new JButton[maxbreite][maxhoehe];
		int bdim=22;
		for (int i = 0; i < maxbreite; i++) {
		  for (int j = 0; j < maxhoehe; j++) {
		     button[i][j] = new JButton();
//		     panel.add(button[i][j]);  
//geht nicht
		     frame.getContentPane().add(button[i][j]);
//geht
		     button[i][j].setBounds(15 + i * bdim+3, 81 + (j * bdim+3) - bdim, bdim, bdim);
				
		     button[i][j].setEnabled(true);
		     button[i][j].addActionListener(new ActionListener() {
		    public void actionPerformed(ActionEvent e) {
			btn_Click(e);
		    }
		});

		}
	     }
			
	}
```

Es währe schön, eine einleuchtende Antwort zu erhalten, warum die Button auf dem Frame erzeugt werden, aber auf dem Panel nicht

Danke


----------



## Joose (8. Mai 2014)

GEHT NICHT IST KEINE FEHLERBESCHREIBUNG

Worin liegt genau das Problem? Exception zur Laufzeit? Kann nicht kompiliert werden wegen Syntaxfehlern?

Hast du das JPanel dem JFrame hinzugefügt? Verwendest du einen LayoutManager? Wenn nicht, hast du dem Panel dann gesagt wo es am JFrame angezeigt werden soll?


----------



## BrunoT (8. Mai 2014)

Hallo Joose,

ich habe mich wohl nicht klar ausgedrückt.

ich habe natürlich ein Panel im Frame erzeugt und geaddet.


```
private void initialize() {
  frame = new JFrame();
  frame.setBounds(100, 100, 450, 467);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


   Panel panel = new JPanel();
   panel.setBounds(10, 0, 353, 408);
   frame.getContentPane().add(panel);
   panel.setLayout(null);
```

Im Quelltext erscheint kein Fehlerhinweis. Erst beim Kompilieren (Eclipse) erzeugt


```
panel.add(button[i][j]);
```

einen Fehler.

Danke für die Hinweise


----------



## njans (8. Mai 2014)

Ich würde sagen du bekommst eine NullPointerException. Ich sehe nirgendwo, dass du button[][] initialisiert hast.


----------



## BrunoT (8. Mai 2014)

Hallo njans,

Der Witz ist aber, das Programm läuft, sobald ich die Button nicht auf dem Panel sondern auf dem Frame erzeuge.


----------



## BrunoT (8. Mai 2014)

```
package proMine;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JCheckBoxMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import javax.swing.JButton;

public class Minensucher {

	public static int array[][];
	private JFrame frame;
	private JPanel panel;
	private JButton button[][]; // Buttonarray
	private int maxbreite = 9, maxhoehe = 9;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Minensucher window = new Minensucher();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Minensucher() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 467);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);

		JMenu mnSpiel = new JMenu("Spiel");
		menuBar.add(mnSpiel);

		JMenuItem mntmNeuF = new JMenuItem("Neu - F2");
		mntmNeuF.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Aufbau_Spielfeld();
			}
		});
		mnSpiel.add(mntmNeuF);

		JCheckBoxMenuItem chckbxmntmAnfaenger = new JCheckBoxMenuItem(
				"Anf\u00E4nger");
		chckbxmntmAnfaenger.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				maxbreite = 9;
				maxhoehe = 9;
				Aufbau_Spielfeld();
			}
		});
		chckbxmntmAnfaenger.setSelected(true);
		mnSpiel.add(chckbxmntmAnfaenger);

		JCheckBoxMenuItem chckbxmntmFortgeschrittene = new JCheckBoxMenuItem(
				"Fortgeschrittene");
		mnSpiel.add(chckbxmntmFortgeschrittene);

		JCheckBoxMenuItem chckbxmntmProfi = new JCheckBoxMenuItem("Profi");
		mnSpiel.add(chckbxmntmProfi);

		JMenuItem mntmNewMenuItem_1 = new JMenuItem("Bestzeiten");
		mnSpiel.add(mntmNewMenuItem_1);

		JMenuItem mntmBeenden = new JMenuItem("Beenden");
		mntmBeenden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
		mnSpiel.add(mntmBeenden);
		frame.getContentPane().setLayout(null);

		/*JPanel panel = new JPanel();
		panel.setBounds(10, 0, 353, 408);
		frame.getContentPane().add(panel);
		panel.setLayout(null);
	*/
		maxbreite = 9;
		maxhoehe = 9;
		Aufbau_Spielfeld();

	}

	protected void Aufbau_Spielfeld() {
		// TODO Auto-generated method stub

		button = new JButton[maxbreite][maxhoehe];
		int bdim=22;
		for (int i = 0; i < maxbreite; i++) {
			for (int j = 0; j < maxhoehe; j++) {
				button[i][j] = new JButton();
//				panel.add(button[i][j]);
				frame.getContentPane().add(button[i][j]);
				button[i][j].setBounds(15 + i * bdim+3, 81 + (j * bdim+3) - bdim, bdim, bdim);
				
				button[i][j].setEnabled(true);
				button[i][j].addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						btn_Click(e);
					}
				});

			}
			}
			
	}

	protected void btn_Click(ActionEvent e) {
		// TODO Auto-generated method stub

	}
}
```


----------



## Androbin (8. Mai 2014)

Vielleicht fügt er ja die Buttons hinzu, zeichnet jedoch das Panel nicht neu opcorn:


----------



## Joose (8. Mai 2014)

BrunoT hat gesagt.:


> Im Quelltext erscheint kein Fehlerhinweis. Erst beim Kompilieren (Eclipse) erzeugt
> 
> ```
> panel.add(button[i][j]);
> ...



Und dieser Fehler lautet?
Sprich du kannst den Code gar nicht ausführen wenn du die Buttons auf ein JPanel geben willst?


----------



## kaoZ (8. Mai 2014)

```
private JPanel panel;
```

Du deklarierst es zwar , aber wo initialisierst du es ?


```
panel = new JPanel();
```

klar das es funktionier wenn du die Buttons auf den Frame packst, und eine NPE bekommst wenn du versuchst die Buttons auf dem panel zu adden 

[TIPP]

```
protected void Aufbau_Spielfeld()
```

methoden schreibt man lowerCamelCase.....

Zudem lass diese "_" weg, das macht alles unnötig unüberischtlich 


```
protected void spielFeldErstellen(...) // wenns dann schon Deutsch sein muss ;)
```

[/TIPP]

Zudem sollte man sich angewöhnen einen Quelltext in einer Sprache zu verfassen, und nicht immer im wechsel, und zwar in *Englisch.*

Deine Formatierung ist übrigens grausam, da würde ich auch auf Dauer Augenkrebs bekommen, geschweige denn Fehler erkennen 

Du solltest dir also auch angewöhnen einzelne Abschnitte oder Handlungen in eigene Hilfsmethoden auszulagern.

Ich meine den Anfang hast du ja schon gemacht 


```
public MienenSucher(){
  initComponents();
  setProperties();
  addComponents();
}
```

Das SpielFeld würde ich übrigends in einer Separaten Klasse definieren, ein MienenSucher *hat* ein SpielFeld, hier besteht also eine has-a beziehung

das bedeutet das das Eigentliche Spiel als Attribut ein SpielFeld besitzt.


```
public class MienenSucher{

  private SpielFeld feld;

...
}
```

Wenn du dich an den Grundgedanken der OOP hälst, sollte *jede Klasse*, *jede Methode* genau *eine* Aufgabe besitzen !

Klar im Normalfall ist das schwer umzusetzen, allerdings schafft es immense Übersichtlichkeit wenn du dich wenigstens grob daran orientierst


----------



## BrunoT (8. Mai 2014)

Hallo noch mal,

ich war eben weg und konnte nicht lesen, was ihr so tolles geschrieben habt.

ich werde bei meinen Bemühungen, diese Sprache zu lernen, eure Hinweise künftig berücksichtigen. Als Anfänger mit Java habe ich mich erst einmal auf den Codegenerator von Eclipse verlassen, um sehenden Auges zu lernen. Nach eurer geschätzten Meinung generiert er also Mist. Gut ich werde schaun.
Das ganze hat aber mit dem eigentlichen Problem noch nichts zu tun.

Also: Ich habe eine Application mit einem Frame, darauf wird ein Panel plaziert (und initialisiert). Auf diese Panel kann ich ganz normal Button platzieren und diese erscheinen auch ganz normal.

Ich habe darauf hin ein Buttonarray[][] zweidimensional deklariert und initialisiert. In einer doppelten Schleife möcht ich die dazu benötigten Instanzen der Button erstellen und platzieren. 
Beim Ausführen kommt dann aber
java.lang.NullPointerException
	at proMine.Minensucher.Aufbau_Spielfeld(Minensucher.java:64)

Zum Verständnis habe ich den Quelltext auf das Wesentliche reduziert.

Ich habedem Panel ein absolutes Layout gegeben.


```
package proMine;

import java.awt.EventQueue;

import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import javax.swing.JButton;

public class Minensucher {

  public static int array[][];
  private JFrame frame;
  private JPanel panel;
  private JButton button[][]; // Buttonarray
  private int maxbreite = 9, maxhoehe = 9;

  /**
   * Launch the application.
   */
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          Minensucher window = new Minensucher();
          window.frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  /**
   * Create the application.
   */
  public Minensucher() {
    initialize();
  }

  /**
   * Initialize the contents of the frame.
   */
  private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 467);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    maxbreite = 9;
    maxhoehe = 9;
    Aufbau_Spielfeld();

  }

  protected void Aufbau_Spielfeld() {
    // TODO Auto-generated method stub

    button = new JButton[maxbreite][maxhoehe];
    int bdim = 22;
    for (int i = 0; i < maxbreite; i++) {
      for (int j = 0; j < maxhoehe; j++) {
        button[i][j] = new JButton();
        panel.add(button[i][j]);  // Hier kommt der Fehler beim Übersetzen
        panel.repaint();
        // frame.getContentPane().add(button[i][j]);
        button[i][j].setBounds(15 + i * bdim + 3, 81 + (j * bdim + 3) - bdim,
            bdim, bdim);
        button[i][j].setEnabled(true);
        button[i][j].addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            btn_Click(e);
          }
        });

      }
    }

  }

  protected void btn_Click(ActionEvent e) {
    // TODO Auto-generated method stub

  }
}
```

Und bitte nett antworten. Ich bin neu hier und die rauhe See noch nicht so gewöhnt.


Danke


----------



## BrunoT (8. Mai 2014)

BrunoT hat gesagt.:


> Hallo noch mal,
> 
> ich war eben weg und konnte nicht lesen, was ihr so tolles geschrieben habt.
> 
> ...



Ich habe noch den aus Versehen gelöschten Teil der Initialisierung des Panels eingefügt, da ich nicht sehe,wie man einen eigenen Beitrag editieren kann.

mfg


----------



## BrunoT (8. Mai 2014)

Ich habe den Fehler gefunden! :lol:

ich habe ein zweites, nicht public definierte Panel angelegt, wollte aber auf dem public definierten Panel die Buttons erstellen. Anfänger:lol:


----------

