Panelinhalt im Programm verändern

Status
Nicht offen für weitere Antworten.

maxth

Aktives Mitglied
Hallo Leute,

ich hab mal wieder ein Problem. In meinem Programm habe ich ein ein BorderLayout.

Das Center Panel bekommt in meinem Programm per Klick immer einen neuen Inhalt. Ich habe mir extra Panel Klassen gemacht die den Center Panel immer füllen sollen.

Könnt ihr mir helfen das ich per Klick immer das Center Panel füllen kann?

In meiner Klasse GUI_ Main habe ich es ausprobiert.

Vielen Dank im vorraus.

GUI_Main

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Label;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

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

public class GUI_Main extends JFrame implements ActionListener{
	

	Container cp = this.getContentPane();
	String iconsDirectory = "icons/";
	protected ShowViewer viewer = null;
	protected GUI_MieterlisteAnz mieter = null;

	
	String text;

	
	
	public GUI_Main(){
		
		super("EasyMKB");
		
		this.setLayout(new BorderLayout());
		this.setSize(800,600);		
		
		
		//ToolBar
		JToolBar toolBar = new JToolBar("Toolbar");
        
        
        addButtons(toolBar);
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		this.add(toolBar, BorderLayout.NORTH);
		
		//CenterPanel
		
		
		viewer = new ShowViewer();
		
		// Wohnung Panel
       JPanel PanelCenter = new JPanel();
       PanelCenter.add(new ShowViewer());
        this.add(viewer, BorderLayout.CENTER);
        viewer.setVisible(false);
        
        //Mieter Panel
        /*PanelCenter.add(new GUI_MieterlisteAnz());
        this.add(mieter, BorderLayout.CENTER);
        mieter.setVisible(false);*/
        
      // this.add(PanelCenter, BorderLayout.CENTER);
        
        JPanel PanelWest = new JPanel();
        PanelWest.setBackground(Color.WHITE);
        PanelWest.add(new Label("Wohnungen Anzeigen"));
        //PanelWest.add(new Label ("Verwaltung von Mietwohnungen"));
		this.add(PanelWest, BorderLayout.WEST);

		
		//SouthPanel
		JPanel PanelSouth = new JPanel();
		
		PanelSouth.add(new Label("Easy MKB 2009"));
		
		this.add(PanelSouth, BorderLayout.SOUTH);
		
		this.setContentPane(cp);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
		//this.add(image);
		this.setVisible(true);
		
		
		
		
	}	
	
	
	
	



	public void addButtons(JToolBar toolBar) {
		JButton button;
		button = createButton("neu", "Neue Wohnung anlegen" );
		toolBar.add(button);
		button = createButton( "wohnung", "Wohnungen Anzeigen" );
		toolBar.add(button);
		button = createButton("rechnung", "Rechnungen Anzeigen");
		toolBar.add(button);
		button = createButton("mieter", "Mieter Anzeigen");
		toolBar.add(button);
		button = createButton("benutzer", "Benutzer Anzeigen" );
		toolBar.add(button);
		button = createButton( "statistik", "Statistiken" );
		toolBar.add(button);
		button = createButton("hilfe", "Online Hilfe");
		toolBar.add(button);
		button = createButton("info", "MKB Info");
		toolBar.add(button);
		

	}

	public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;
			
	}
	

	
	public static void main (String[] args){
		new GUI_Main();		
	}

	@Override
	public void actionPerformed(ActionEvent evt) {
		if (evt.getActionCommand().compareTo("info") == 0)
			try {
				new Info();
			} catch (IOException e) {
				
			}
			
			if (evt.getActionCommand().compareTo("hilfe") == 0)
				try {
					new Hilfe();
				} catch (IOException e) {
					
				}
				
				
				if (evt.getActionCommand().compareTo("wohnung") == 0)
					//mieter.setVisible(false);
					
					
					viewer.setVisible(true);
			    
					//this.remove(viewer);
					//viewer = new ShowViewer();
		            //this.add(viewer, BorderLayout.CENTER);
		            //repaint();
		        
					if (evt.getActionCommand().compareTo("mieter") == 0)
						
						viewer.setVisible(false);
						
						this.add(mieter, BorderLayout.CENTER);
		
	}}
 
Ich hab mir den Code nicht angesehen, aber für dein Vorhaben gibt es ein spezielles Layout namens CardLayout. D.h. das Panel, das du im Center addest, kriegt das CardLayout:

Java:
centerPanel.setLayout(new CardLayout());

Dort kannst du dann erstmal alle möglichen Inhalte adden:

Java:
centerPanel.add(inhaltPanel1, "inhalt 1");
centerPanel.add(inhaltPanel2, "inhalt 2");
centerPanel.add(inhaltPanel3, "inhalt 3");
// usw

Per show() auf dem Layout kannst du auswählen welche dieser Inhalte er anzeigen soll. Das wäre dann das, was in deinen MouseListener muss:

Java:
CardLayout cl = (CardLayout) centerPanel.getLayout();
cl.show(centerPanel, "inhalt 2");
 
Vielen Dank für deine Antwort, ich hab versucht umzusetzen wie du es mir gesagt hast.

Es sieht ungefähr so aus

Konstruktor

Java:
public GUI_Main()

ShowViewer viewer = new ShowViewer();
GUI_MieterlisteAnz mieter = new GUI_MieterlisteAnz();

 JPanel PanelCenter = new JPanel();
       PanelCenter.setLayout(new CardLayout());
       PanelCenter.add(viewer, "Wohnungen");
       PanelCenter.add(mieter, "Mieter");

this.add(PanelCenter, BorderLayout.CENTER);

Probleme habe ich jetzt beim ActionListener

Java:
if (evt.getActionCommand().compareTo("mieter") == 0)

Wie nehme ich den Teil jetzt rein?

Java:
CardLayout cl = (CardLayout) centerPanel.getLayout();
cl.show(centerPanel, "inhalt 2");

Dieser Teil muss noch teil des Konstruktors sein?

Um meine Frage eindeutlicher zu gestalten. Wie sieht das wechseln des Layouts mit dem ActionListener aus?
 
Das muss nicht unbedingt in den Konstruktor. Es ist halt nur so dass du auf dein "PanelCenter" zugreifen musst. D.h. wo auch immer du den Mouse-Listener addest, muss das also bekannt sein.

Der Code in der actionPerformed() sieht dann genau so aus wie ich ihn geschrieben habe. Natürlich musst du die Namen anpassen.

btw: Variablen-Namen schreibt man in camelCase, also panelCenter. Und Klassen schreibt man in CamelCase, also GuiMain oder GUIMain statt Gui_Main. Solche Zeichen sollten vermieden werden.
 
Problem dabei ist jetzt.
Java:
if (evt.getActionCommand().compareTo("wohnung") == 0)
					
				CardLayout cl = (CardLayout) PanelCenter.getLayout();
				cl.show(CenterPanel, "wohnung");


Wie mache ich das CardLayout in meinem Actioncommand bekannt?
So wie es da ist, funktioniert es leider nicht.
 
das Import für das CardLayout habe ich drin.

Ich scheint mit dem PanelCenter Probleme zu haben, aber wieso?
muss ich den nochmal in meinem Action command bekannt machen?
 
Ich glaube eher er meint nicht das CardLayout sondern das Panel. Wie ich schon sagte, entweder du baust das alles direkt im Konstruktor zusammen (kennst du anonyme Klassen?), oder du musst das Panel deinem ActionListener übergeben, damit er es kennt.

Es ist auch grad schwer zu helfen weil ich nicht den blassesten Schimmer habe, wo genau dieser ActionCommand dranhängt. An welcher Komponente? Wo addest du ihn? Wo genau steht dann die actionPerformed() Methode?
 
Also

hier Adde ich den Action Command

Java:
public JButton createButton(String actionCommand, String toolTipText) {
		String imgLocation = iconsDirectory + actionCommand + ".jpg";
		JButton button = new JButton();
		button.setActionCommand(actionCommand);
		button.setToolTipText(toolTipText);
		button.addActionListener(this);
		button.setIcon(new ImageIcon(imgLocation, actionCommand));
		
		return button;

Ich arbeite mit einer Toolbar und da hängt alles dran.
 
math falls du meinen letzten Post nicht gelesen hast: Du solltest dich erstmal schlau machen über den Unterschied zwischen lokalen und "globalen" Variablen.

In der FAQ finde ich dazu gar nix, deswegen hier kurze Erklärung:
Jede Variable die "frei" in der Klasse deklariert wird, ist global:

Java:
class MyClass{

   // hier stehen vllt Methoden oder der Konstruktor

   int globaleVariable;

   // hier stehen vllt weitere Methoden

}

Das bedeutet dass diese Variable überall in der Klasse sichtbar ist.
Lokale Variablen sind diejenigen, die nicht frei in der Klasse deklariert werden, sondern in einem Block. Ein Block heisst zwischen { und }.

zB eben im Konstruktor

Java:
class MyClass{

   int globaleVariable;

   public MyClass(){
      int lokaleVariable = 2;
   }
}

"loakleVariable" ist in dem Moment, wo der Block des Konstruktors aufhört, nicht mehr sichtbar. D.h. an anderen Stellen in der Klasse exisitert diese Variable nicht.
Deshalb findet dein ActionCommand auch dein Panel nicht, weil du es lokal im Konstruktor definierst.

Darum

- entweder das Panel global deklarieren, und im Konstruktor nur instantiieren
- oder im Konstruktor deklarieren, wie du es jetzt schon hast, und dann aber dem ActionListener mitgeben. Dafür musst du dir dann nen eigene ActionListener bauen der das Teil annimmt.
 
Also, ich habe jetzt

Java:
JPanel CenterPanel = new JPanel();
		CardLayout cl = (CardLayout) CenterPanel.getLayout();

diese zwei Teile global deklariert.

im Konstruktor habe ich

Java:
			viewer = new ShowViewer();
			mieter = new GUI_MieterlisteAnz();
			
			// Center Panel
		//	CenterPanel.setLayout(new CardLayout());
			
	      // JPanel PanelCenter = new JPanel();
	       
	      //CardLayout cl = (new CardLayout());
	       
	       CenterPanel.add(viewer, "Wohnungen");
	       CenterPanel.add(mieter, "Mieter");

this.add(CenterPanel, BorderLayout.CENTER);

Und ich in meiner ActionCommand

Java:
if (evt.getActionCommand().compareTo("wohnung") == 0)
						
						//CardLayout cl = (CardLayout) CenterPanel.getLayout();
					
						cl.show(CenterPanel, "Wohnungen");

Wenn ich das ausführen möchte bekomme ich dies hier
Java:
Exception in thread "main" java.lang.ClassCastException: java.awt.FlowLayout cannot be cast to java.awt.CardLayout
	at GUIMain.<init>(GUIMain.java:31)
	at GUIMain.main(GUIMain.java:150)
 
Vielen Dank für eure Hilfe, es funktioniert jetzt so wie ich es möchte.

Ich wünsche euch noch ein schönes Wochenende. Ausser ihr stoßt noch öfters auf meiner Beiträge 😳
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben