zweidimensionales Buttonarray auf Panel

BrunoT

Mitglied
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.

Java:
	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
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
Hallo Joose,

ich habe mich wohl nicht klar ausgedrückt.

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

Java:
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

Java:
   panel.add(button[i][j]);

einen Fehler.

Danke für die Hinweise
 
Ich würde sagen du bekommst eine NullPointerException. Ich sehe nirgendwo, dass du button[][] initialisiert hast.
 
Java:
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

	}
}
 
Java:
private JPanel panel;

Du deklarierst es zwar , aber wo initialisierst du es ?

Java:
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]
Java:
  protected void Aufbau_Spielfeld()

methoden schreibt man lowerCamelCase.....

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

Java:
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 😉

Java:
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.

Java:
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 🙂
 
Zuletzt bearbeitet:
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.

Java:
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
 
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 habe dem Panel ein absolutes Layout gegeben.

Java:
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);
    JPanel panel = new JPanel();
    panel.setBounds(10, 0, 353, 241);
    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]);  // 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

  }
}



Danke

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
 
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:
 

Neue Themen


Zurück
Oben