Swing Panels Wechseln

Putzzmunta

Mitglied
Hallo, ich bin gerade dabei anzufangen, graphisch zu programmieren. Ich bekomme es aber nicht hin, ein Frame zu erstellen, auf welchem ich Pannels überschreiben kann.
Meine Idee ist ich habe ein Frame auf dem setze ich dann immer die jeweiligen Panels. Geht dies ?
Code:
public static void repaint(JFrame Framen, JPanel Paneln) { // Die Grafik neu
        // macht den repaint
       
        Framen.remove(Framen.getContentPane());
        Framen.setContentPane(Paneln);
        Framen.repaint();

    }
Dies ist meine repaint Methode. Aber wenn ich dies jetzt auf einem anderem "Panel" ausführe bekomme ich immer eine Fehlermeldung. ich bitte um Hilf e
Lg Yannik
 
Du denkst zu kompliziert 🙂

Schau dir mal das CardLayout an. Dort kannst du verschiedene Panels zu deinem Frame hinzufügen und sie mit der methode show() und hide() sichtbar machen / verstecken 🙂
 
ähm muss ich dann dem Frame zuweisen oder ? Aber Danke erstmal bin noch relativ neu in Swing deswegen. Die ganzen Bücher enden immer ohne komplexe Anwendungen, wo auch mal das Bild komplett neu gezeichent werden muss.
 
Ok jetzt habe ich alles geschrottet... 😀
ähm meine Frame Klasse:
Java:
package Grafik;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridLayout;
import java.awt.CardLayout;

public class Frame extends JFrame {

        //Daten
        public static int breite=450;
        public static int höhe=300;
        public static int Bx=20;
        public static int By =20;
      
        public Frame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(Bx, By, breite, höhe);
        setCursor(Cursor.HAND_CURSOR);
        setResizable(true);
        setTitle("Yanniks Schiffe versenken");
      
      
    }

}

und meine Methodenklasse :
Code:
package Grafik;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MethodenGrafik {
    // Panels
    private static JPanel MPanel;
    private static JPanel EPanel;
    private static Frame Fenster;
    public static int Panel;

    public static void repaint(JFrame Framen, JPanel Paneln) { // Die Grafik neu
        // macht den repaint
      
        Framen.remove(Framen.getContentPane());
        Framen.setContentPane(Paneln);
        Framen.repaint();

    }

    public static void grafikTesten() { // Methode zum testen der Grafik...
        FErstellen();
        panelErstellen();
        repaint(Fenster, EPanel);

    }

    public static void panelErstellen() { // Panels Erstellen
        MPanel = new Menue();
        EPanel = new Einstellungen();
    }

    public static void FErstellen() {
        // Frame
        Frame Fenster = new Frame();
        Fenster.setVisible(true);

    }

  
  

}
.. Also wollte das eben Umsetzten und jetzt geht mein Code garnicht mehr.
ich danke im Vorraus
 
Also mal wirklich ein gaaaanz kleines kompilierbares Beispiel für dich:
Java:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {
  public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new Test();
      }
    });
  }
  
  public Test() {
    JFrame frame = new JFrame("CardLayout-Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setLocationByPlatform(true);
    
    JPanel greenPanel = new JPanel();
    greenPanel.setBackground(Color.GREEN);
    
    JPanel bluePanel = new JPanel();
    bluePanel.setBackground(Color.BLUE);
    
    CardLayout cardLayout = new CardLayout(20, 20);
    JPanel mainPanel = new JPanel(cardLayout);
    mainPanel.add(greenPanel, "Green");
    mainPanel.add(bluePanel, "Blue");
    
    JComboBox<String> layoutSwitch = new JComboBox<>(new String[] { "Green", "Blue" });
    layoutSwitch.addItemListener(new ItemListener() {
      @Override
      public void itemStateChanged(ItemEvent e) {
        cardLayout.show(mainPanel, e.getItem().toString());
      }
    });
    frame.add(layoutSwitch, BorderLayout.NORTH);
    frame.add(mainPanel, BorderLayout.CENTER);
    frame.setVisible(true);
  }
}
 
schlau wie ich war habe ich den falschen Code gepostet upps.
Also ich habe in mein Frame reingeschrieben:
Java:
public Frame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(Bx, By, breite, höhe);
        setCursor(Cursor.HAND_CURSOR);
        setResizable(true);
        setTitle("Yanniks Schiffe versenken");
        layout= new CardLayout();
        setLayout(layout);
    }
in meine Panels jeweils
Java:
public Menue() {
      
        setBounds(Frame.Bx, Frame.By, Frame.breite, Frame.höhe);
        setBackground(SystemColor.textHighlight);
        setLayout(Frame.layout);
...}
und
Java:
public Einstellungen() {
        setBounds(Frame.Bx, Frame.By, Frame.breite, Frame.höhe);
        setBackground(SystemColor.textHighlight);
        setLayout(Frame.layout);
...}
und in meiner Methodenklasse
Java:
public static void panelErstellen() { // Panels Erstellen
        MPanel = new Menue();
        EPanel = new Einstellungen();
      
        Frame.layout.addLayoutComponent("Menü",MPanel );
        Frame.layout.addLayoutComponent("Einstellungen",EPanel);
    }
sowie
Java:
public static void repaint(CardLayout layout, JPanel Paneln,String Name) { // Die Grafik neu
        // macht den repaint
      
        layout.show(Paneln, Name);
            }
Viele Dank für jede Hilfe
 
Okay danke, das funktioniert jetzt schon in meiner Methodenklasse. Vielen Danke habe es aber wahrscheinlich viel zu kompliziert geschrieben. Aber ich bin happy ^^
@alle mein Code von oben ist Quatsch ^^ haltet euch an das Beispiel
 
Doch kannst du entweder mit der Maus das Fenster größer ziehen oder eben die gewünschte Größe setzen und neuzeichnen lassen 😉
 

Zurück
Oben