Validate()

kaoZ

Top Contributor
Hallöchen ich arbeite grade weiter an meiner Anwendung und habe eine kleine Frage,

ich habe vorerst mein JMenu und dessen Items nicht ausgelagert um zu testen wie ich am geschicktesten die Eventverarbeitung handhabe.....

zzt. sieht es folgenderMaßen aus:

Java:
import static constants.Constants.SCREEN_HEIGHT;
import static constants.Constants.SCREEN_WIDTH;
import static constants.Constants.TITLE;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.border.EtchedBorder;

import panels.Estimate;
import panels.Invoice;
import panels.SideMenu;

public class EditorView implements ActionListener{
	
	JFrame frame;
	JMenuBar bar;
	JToolBar toolBar;
	JPanel sideMenuPanel, printPanel, statusBar;
	
	public EditorView() {
		createFrame();
		createPanel();
		createMenu();
		
		addComponents();
		
	}
	
	private void createFrame(){
		frame = FrameFactory.createFrame(TITLE, SCREEN_WIDTH, SCREEN_HEIGHT, 2, null);
	}
	
	private void createPanel(){	
		sideMenuPanel = new JPanel();
		printPanel = new JPanel();
		statusBar = new JPanel();
		
		//sideMenuPanel.setBackground(Color.RED);
		sideMenuPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		sideMenuPanel.setLayout(new BoxLayout(sideMenuPanel, BoxLayout.PAGE_AXIS));
		sideMenuPanel.add(new SideMenu());
		
		//printPanel.setBackground(Color.BLUE);
		printPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		printPanel.setLayout(new BorderLayout());
		
		//statusBar.setBackground(Color.YELLOW);
		statusBar.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		statusBar.setPreferredSize(new Dimension(frame.getWidth(), 25));
	}
	
	private void createMenu(){
		bar = new JMenuBar();
		
		JMenu fileMenu = new JMenu("Datei");
		JMenu editMenu = new JMenu("Bearbeiten");
		JMenu optionMenu = new JMenu("Einstellungen");
		JMenu windowMenu = new JMenu("Fenster");
		JMenu helpMenu = new JMenu("Hilfe");
		
		JMenu[] list = {fileMenu, editMenu, optionMenu, windowMenu, helpMenu};
		
		for (JMenu jMenu : list) {
			bar.add(jMenu);
		}
		
		JMenu fileSub = new JMenu("Neu...");
			JMenuItem invoice = new JMenuItem("Neue Rechnung");
				invoice.addActionListener(this);
				invoice.setActionCommand("invoice");
			JMenuItem estimate = new JMenuItem("Neuer Kostenvoranschlag");
				estimate.addActionListener(this);
				estimate.setActionCommand("estimate");
			fileSub.add(invoice);
			fileSub.add(estimate);
			
		JMenuItem openFile = new JMenuItem("Öffnen...");
		JMenuItem closeFile = new JMenuItem("Schließen...");
		JMenuItem closeAll = new JMenuItem("Alles Schließen...");
			closeAll.addActionListener(this);
			closeAll.setActionCommand("closeAll");
		JMenuItem closeApp = new JMenuItem("Beenden...");
			closeApp.addActionListener(this);
			closeApp.setActionCommand("closeApp");
		
		fileMenu.add(fileSub);
		fileMenu.add(openFile);
		fileMenu.addSeparator();
		fileMenu.add(closeFile);
		fileMenu.add(closeAll);
		fileMenu.addSeparator();
		fileMenu.add(closeApp);
	}
	
	private void addComponents(){
		frame.add(BorderLayout.PAGE_START, bar);
		frame.add(BorderLayout.LINE_START, sideMenuPanel);
		frame.add(BorderLayout.CENTER, printPanel);
		frame.add(BorderLayout.PAGE_END, statusBar);
	}

	public void show(){
		frame.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		switch(e.getActionCommand()){
		
		case "invoice":
			printPanel.add(BorderLayout.CENTER, new Invoice()); //<<-- Funktioniert
			printPanel.validate();  
			break;
		case "estimate":
			printPanel.add(BorderLayout.CENTER, new Estimate()); //<<-- Funktioniert
			printPanel.validate();
			break;
		case "closeAll":
			//TODO  // <<-- Hier funktioniert printPanel.removeAll(); nicht....
			break;
		case "closeApp":
			System.exit(0);
			break;
			
			
		}
	}

}

Da das Menu zzt. noch in dem "Mainview" ausprogrammiert wird, sieht alles noch nach Spagetti Code aus, um dies zu vermeiden würde ich zu einem Späteren Zeitpunkt die JMenuBar in eine eigenständigen Klasse auslagern wollen.

Nun aber mal zu meinem Konkreten Problem.

Ich habe mich erstmal für die Eventverarbeitung per ActionCommand entschieden, ob das jetzt die sauberste Lösung ist wage ich allerdings zu bezweifeln, mein Problem ist jetzt , ich kann dem PrintPanel (also dem Rechten Panel) im Frame zwar neuen Inhalt zuweisen ( neue Rechnung oder Kostenvoranschlage) aber diese nicht wieder entfernen.....

Ich hatte bereits versucht über den Aufruf von
Code:
printPanel.removeAll();
den Panel wieder in den Ursprungszustand zu versetzen , jedoch ohne Erfolg.

Hat jemand eine Idee ? selbst der Versuch den printPanel nach dem Aufruf nochmal zu validieren brachte keinen Erfolg.

[EDIT]die nächste Frage wäre , wenn ich die MenuBar in eine eigene Klasse Auslager, welche ich von JMenuBar ableite, wie handhabe ich dann die Events am Sinnvollsten, da ich ja dort keine Referenz auf die zu verwendenden Panel halte , in welche dann Komponenten geadded werden sollen?
Die gleiche Frage stellt sich mir für das SideMenu(), auch hier wird das Menu in einer eigenständigen Klasse realisiert, wie verfahre ich mit dem Listener ?[/EDIT]

Das Funktioniert zumindest soweit das jetzt wieder , logischerweise ein leeren Panel angezeigt wird, aber es muss doch möglich sein das zuvor bereits Initialisierte Panel anzuzeigen , oder ?
[EDIT]
Java:
case "invoice":
			printPanel.removeAll();
			printPanel.add(BorderLayout.CENTER, new Invoice());
			printPanel.validate();
			break;
		case "estimate":
			printPanel.removeAll();
			printPanel.add(BorderLayout.CENTER, new Estimate());
			printPanel.validate();
			break;
		case "closeAll":
			printPanel.removeAll();
			printPanel.add(new JPanel());
			printPanel.validate();
			break;
[/EDIT]
 
Zuletzt bearbeitet:

TheSorm

Bekanntes Mitglied
Naja letzten endes kanst alles auf setVisible(false) setzten was nichmehr drauf sein soll, aber wenn du wirklich wilst das das panal GANZ clean sein soll würde ich das alte auf setVisible(false) setzten und es neue inizialisieren.
 

Ähnliche Java Themen

Neue Themen


Oben