JPanel auslagern

Kaffee

Mitglied
Hallo,
ich bin (offensichtlich) ein totaler Anfänger und habe eine Frage, die wohl nicht allzu schwer zu beantworten ist.
Ich möchte verschiedene Menüs (in diesem Beispiel Hauptmenü & Optionsmenü) in eigene Klassen auslagern. Der Code dazu sieht folgendermassen aus:

Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Window extends JFrame
{
  Window()
  {
    super("TITEL");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setMinimumSize(new Dimension(100,100));
    setSize(500,500);
    setResizable(false);
    setLocationRelativeTo(null);
    
    Container con = getContentPane();
    JPanel main = new MainMenue();
    con.add(main);
    
    setVisible(true);
  }
  
  private void resizeWindow(int newWidth, int newHeight)
  {
    this.setSize(newWidth,newHeight);
  }
  
  public static void main(String args[])
  {
    Window window = new Window();
  }
}

Java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MainMenue extends JPanel implements ActionListener
{
  JButton b1 ;
  JButton b2 ;
  
  public void MainMenue()
  {
    b1 = new JButton("Start");
    b1.addActionListener(this);
    this.add(b1);
    b2 = new JButton("Options");
    this.add(b2);
    this.setBackground(Color.white);
    
  }
  
  public void actionPerformed(ActionEvent e)
  {
    if(e.getSource() == b1){
      System.out.println("BUTTON CLICKED");
    }
  }
}

Unglücklicherweise bewirkt das JPanel keine Veränderung.

MfG, Kaffee
 
Zuletzt bearbeitet:
Benenn' die Klasse mal um, "Window" ist schon belegt. Ansonsten sollte sich das nicht compilieren lassen, weil MainPanel im Konstruktor einen Container erwartet, aber keinen bekommt. Und... "keine Veränderung" - was heißt das?
 
Und ausserdem gibt es auch noch die JMenuBar, die du dem JFrame verpassen kannst. Also eine Menüleiste mit mehreren Menüpunkten (JMenu) und auch verschachtelten Unterpunkten (JMenuItem).
 
Es geht mir nicht darum, diese konkrete Situation zu lösen, sondern zu lernen, wie man mehrere JPanels verwenden kann. "Keine Veränderung" bedeutet, dass zwar das JFrame vorhanden ist, die Buttons allerdings fehlen. Kompilieren lässt sich das Programm ohne Probleme. Die Übergabe des Containers war nur ein Versuch, den ich nicht enfernt have -> kann ignoriert werden 😀
MfG, Kaffee 🙂
 
Zuletzt bearbeitet:
Ach so... Grundsätzlich solltest du dir dann mal die LayoutManager (siehe FAQ) anschauen, mit denen du mehrere Komponenten (also auch JPanels) in dein JFrame bekommen und anordnen kannst.

EDIT:

Hast du den Namen der Klasse Window mal umbenannt?

Und wie ich gerade sehe, hast du Fehler bei den Konstruktoren.
Java:
...
public class MainMenue extends JPanel implements ActionListener
{
  JButton b1 ;
  JButton b2 ;
  
  public void MainMenue()
  {
...
Das void im Konstruktoraufruf muss weg, also nur
Code:
public MainMenue() {}
.
 
Zuletzt bearbeitet von einem Moderator:
Da hast du mich falsch verstanden. Ich möchte nicht mehrere JPanels auf einmal verwenden. Mein Gedankengang war es, verschiedene JPanels (je als eigene Klasse) zum ContentPane hinzuzufügen und wieder zu entfernen, so das alles übersichtlich bleibt.
Beispiel:
-Klasse Optionen
-Klasse Hauptmenü
-Klasse ZeichenPanel
-Haupt-Klasse Window, die alle JPanels je nach Bedarf verwaltet.

MfG, Kaffee :applaus:
 
Aber auch da solltest du evtl. besser mit LayoutManagern arbeiten. Der JFrame hat als Standard das BorderLayout gesetzt. Und beim BorderLayout kannst du pro Bereich (NORTH, SOUTH, WEST, EAST, CENTER) nur 1 Komponente setzen. Wenn du mehrere JPanels oder Komponenten dort reinsetzen willst, musst du die LayoutManager schachteln. Wenn du immer nur 1 JPanel dem JFrame hinzufügst, landet das im CENTER-Bereich, und da bekommst du gleichzeitig nur 1 JPanel rein. Wenn du zwischen mehreren JPanel hin- und herwechseln möchtest, würde ich dir das CardLayout empfehlen.
 
Danke für die Denkanstösse, ich werde es mit deinen Ideen probieren. Vielleicht ist damit ja schon das Problem gelöst.
MfG, Kaffee 🙂

Edit: Das CardLayout ist auf jeden Fall eine bessere Lösung als das manuelle verwalten der JPanels.
Allerdings weiss ich auch beim CardLayout nicht, wie ich die verschiedenen Cards in eigene Klassen / Dateien auslagern kann. Mit einem Beispiel wäre mir schon sehr geholfen. :toll:
 
Zuletzt bearbeitet:
Eigentlich läuft das mit dem CardLayout und dem Auslagern der verschiedenen Panels/Cards schon so ähnlich, wie du es gemacht hattest. Du hast ein Hauptpanel mit dem CardLayout als LayoutManager, welches du deinem JFrame hinzufügst. Landet dann im CENTER-Bereich, wenn du nichts anderes angibst, weil der JFrame ja das BorderLayout als Standard hat. Dann erstellst du für jedes Panel, welches du dem CardLayout hinzufügen möchtest eine Klasse, die von JPanel erbt. (Schau dir aber bei meinem Beitrag weiter oben nochmal mein EDIT an, wegen dem Namen für die Klasse Window und den fehlerhaften Konstruktoren) Dann erstellst du in deiner Hauptklasse von jedem deiner Panels ein Objekt (mit new) und fügst diese Objekte deinem CardLayout hinzu. Dann musst du dir nur noch eine Steuerung überlegen, wie du zwischen den Cards wechselst. Such mal im Internet, da gibt es jede Menge Beispiele...
 
Ganz grob sieht das etwa so aus:
Java:
import java.awt.CardLayout;

public class HauptPanel
extends JPanel {
	
	private CardLayout cardLayout;
	
	public HauptPanel() {
				
		cardLayout = new CardLayout();
		setLayout( cardLayout );
		
		// Panel zum CardLayout hinzufügen
		add( new Panel1(), "Panel1" );
		add( new Panel2(), "Panel2" );
		add( new Panel3(), "Panel3" );
		add( new Panel4(), "Panel4" );
		add( new Panel5(), "Panel5" );
		
	}


	// Methode zeigt die gewünschte Seite (Panel) im Frame an
	public void setCards( String cardname ) {
		cardLayout.show( this, cardname );
	}

}

Die einzelen Panels machst du dann so:
Java:
public class Panel1
extends JPanel {
    
    public Panel1() {

    // ...

    }

}
 

Zurück
Oben