Klassen Wechsel der Ansichten in einer GUI

3njoyeD

Mitglied
Abend Comunity,

ich habe semantische Fehler in meinem Programm.
Habe mir Konsolenausgaben mit einprogrammiert um den Fehler einzugrenzen,
aber ich komme trozdem nicht auf den grünen Zweig..

Ich möchte in meiner GUI anfangs eine Startansicht anzeigen lassen, dann über ein Menü die Ansichten wechseln.
Dazu setze & rücksetzte ich booleans beim Betätigen einer Ansicht im Menü.
Anschließend frage ich diese booleans ab & instanziere ein Objekt der jeweiligen Klasse.
Es soll nur zum Grundverständniss die Hintergrundfarbe gewechselt werden.

Das Problem ist, das dauernd die Klasse der Startansicht aufgerufen wird.

Ist meine Idee so vorzugehen überhaupt richtig, also gehen die Fortgeschrittener genauso vor(von der Grundidee zumindest), oder bin ich auf dem völlig falschen Dampfer?

Hier die Main:

Java:
public class mainFrame extends JFrame {

	private JPanel contentPane;
	private boolean startansicht = true;		// <- absichtlich anfangs auf true gesetzt
	private boolean ansicht1 = false;
	private boolean ansicht2 = false;
	private StartView startAnsicht;
	private ViewOne ersteAnsicht;
	private ViewTwo zweiteAnsicht;
	
	/**
	 * Launch the application.
	 */
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					mainFrame frame = new mainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	
	public mainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(0, 0, 450, 300);
		setLocationRelativeTo(null);
		
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		System.out.println("Anfang des Frames - Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);

		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnAnsichtWechseln = new JMenu("Ansicht wechseln");		// Wenn ich das Menü Ansicht wechseln betätige wird direkt die Klasse SartView unaufgefordert! aufgerufen
		menuBar.add(mnAnsichtWechseln);									
		
		
		JMenuItem mntmStartanzeige = new JMenuItem("Startanzeige");
		mntmStartanzeige.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {									// Betätigen der Startanzeige
				
				System.out.println("Anfang von Betätigung der Startanzeige im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
				ansicht1 = false;
				ansicht2 = false;
				startansicht = true;
//				mntmStartanzeige.setEnabled(false);			dazu habe ich später noch eine Frage, vorerst rausgenommen
//				mntmAnsicht_1.setEnabled(true);
//				mntmAnsicht_2.setEnabled(true);
				System.out.println("Ende von Betätigung der Startanzeige im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
				
			}
		});
		mnAnsichtWechseln.add(mntmStartanzeige);
		
		
		
		JMenuItem mntmAnsicht_1 = new JMenuItem("Ansicht 1");					
		mntmAnsicht_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {									// Betätigen von Ansicht 1
				System.out.println("Anfang von Betätigung der Ansicht 1 im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
				startansicht = false;
				ansicht2 = false;
				ansicht1 = true;
//				mntmAnsicht_1.setEnabled(false);
//				mntmStartanzeige.setEnabled(true);
//				mntmAnsicht_2.setEnabled(true);
				System.out.println("Ende von Betätigung der Ansicht 1 im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
			}
		});
		mnAnsichtWechseln.add(mntmAnsicht_1);
		

		
	 JMenuItem mntmAnsicht_2 = new JMenuItem("Ansicht 2");
			mntmAnsicht_2.addActionListener(new ActionListener() {				
			public void actionPerformed(ActionEvent arg0) {									// Betätigen von Ansicht 2
				
				
				System.out.println("Anfang von Betätigung der Ansicht 2 im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
				startansicht = false;
				ansicht1 = false;
				ansicht2 = true;
//				mntmAnsicht_2.setEnabled(false);
//				mntmAnsicht_1.setEnabled(true);
//				mntmStartanzeige.setEnabled(true);
				System.out.println("Ende von Betätigung der Ansicht 2 im Menü");
				System.out.println("Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
				
			}
		});
		mnAnsichtWechseln.add(mntmAnsicht_2);
		
		
		if (startansicht == true && ansicht1 == false && ansicht2 == false){		// Abfrage Startansicht
			try {
				StartView startAnsicht = new StartView ();
				contentPane.add(startAnsicht);
				startansicht = true;
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Fehler beim Erstellen des Startbildschirms");
			}
		}
		
		if (startansicht == false && ansicht1 == true && ansicht2 == false){	// Abfrage Ansicht 1
			try {
				ViewOne ersteAnsicht = new ViewOne ();
				contentPane.add(ersteAnsicht);
				ansicht1 = true;
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Fehler beim Anzeigen der ersten Ansicht");
			}
		}
		
		if (startansicht == false && ansicht1 == false && ansicht2 == true){	// Abfrage Ansicht 2
			try {
				ViewTwo zweiteAnsicht = new ViewTwo ();
				contentPane.add(zweiteAnsicht);
				ansicht2 = true;
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Fehler beim Anzeigen der zweiten Ansicht");
			}
		}
		
		
		System.out.println("Nach den Abfrage - Startansicht: " + startansicht + " --- Ansicht 1: " + ansicht1 + " --- Ansicht 2:" + ansicht2);
		
		
	}

}

Die anderen Klassen sind soweit alle gleich, bis auf die gesetzte Hintergrundfarbe & der Konsolenausgabe:

Java:
public class StartView extends JPanel {
	public void paint ( Graphics g) {
		super.paint(g);
		setBackground(Color.WHITE);
		System.out.println("Bin in der Klasse der Startansicht");
	
	}	
}

Syntaktisch scheint alles richtig zu sein.
Das Programm wird ohne Ausführung der einprogrammierten Fehlermeldungen ausgeführt.

- 3njoyeD -
 
ich habe semantische Fehler in meinem Programm.
Du meinst wohl einen Logikfehler (Denkfehler), dein Programm scheint ja zu kompilieren...

Habe mir Konsolenausgaben mit einprogrammiert um den Fehler einzugrenzen,
Lern wie man einen Debugger benutzt, dann sollte dir schon beim durchsteppen auffallen, warum dein Programm so nicht funktionieren kann.

Dazu setze & rücksetzte ich booleans beim Betätigen einer Ansicht im Menü.
boolean flags - UGH - aber das nur nebenbei

Anschließend [...]
Falsch.
 
Du meinst wohl einen Logikfehler (Denkfehler), dein Programm scheint ja zu kompilieren...
Semantische Fehler beschäftigen sich mit der Bedeutung von Sequenzen. Also ja.
boolean flags - UGH - aber das nur nebenbei
Habe Wiki nochmal befragt.
Ein Flag kann gesetzt, gelöscht oder ausgelesen werden.
Was ist nun an meiner Formulierung falsch?
booleans sind binäre Datentypen, also kann man es doch auch mit einem Bit vereinigen.

Anfangs einer GUI wird eine Laufzeitumgebung gestartet:
Java:
EventQueue.invokeLater(new Runnable()
Diese fragt in Echtzeit unter anderem die Größe des Fensters ab.
(So ist es mir zumindest aufgefallen, ich hoffe das passt so)

Kurz nachdem ich den Quellcode hier ins Forum gepostet habe,
ist mir mein Fehler in der allgemeinen Vorgehensweise klar geworden.

Ich habe andere Denkstrukturen eines anderes Bereichs in mir verankert,
die ich mit der Informatik erstmal komplett trennen muss.

Danke für den Tritt in den Hintern :autsch:

Habe es nun so erstellt:

Frame Instanzierung & Einstellung:
Java:
public class mainFrame extends JFrame {
	
	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					mainFrame frame = new mainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}


	public mainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(0, 0, 450, 300);
		setLocationRelativeTo(null);
		
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		

		final draw zeichnen = new draw ();
		contentPane.add(zeichnen);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnAnsichtWechseln = new JMenu("Ansicht wechseln");		
		menuBar.add(mnAnsichtWechseln);									
		
		
		JMenuItem mntmStartanzeige = new JMenuItem("Startanzeige");
		mntmStartanzeige.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {									// Betätigen der Startanzeige
				zeichnen.startAnzeige();	// Aufrufen der Methode startAnzeige in der Klasse draw	
			}
		});
		mnAnsichtWechseln.add(mntmStartanzeige);

		JMenuItem mntmAnsicht_1 = new JMenuItem("Ansicht 1");					
		mntmAnsicht_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {									// Betätigen von Ansicht 1		
				zeichnen.ansicht1();	
			}
		});
		mnAnsichtWechseln.add(mntmAnsicht_1);

	 JMenuItem mntmAnsicht_2 = new JMenuItem("Ansicht 2");
			mntmAnsicht_2.addActionListener(new ActionListener() {				
			public void actionPerformed(ActionEvent arg0) {									// Betätigen von Ansicht 2
				zeichnen.ansicht2();	
			}
		});
		mnAnsichtWechseln.add(mntmAnsicht_2);
		
		
		
	}

}

Zweite Klasse:
Java:
public class draw extends JPanel {
	
	
	private byte auswahl = 0;

	public void startAnzeige () {
		auswahl = 0;
		
	}
	
	public void ansicht1 () {
		auswahl = 1;
		
	}
	
	public void ansicht2 () {
		auswahl = 2;
		
	}

	
	public void paint ( Graphics g) {
		super.paint(g);
	
		switch (auswahl) {
		
		case 0:		// Startanzeige
			setBackground(Color.WHITE);
			g.drawLine(0, 0, getWidth(), getHeight());
			g.drawLine(getWidth(), 0, 0, getHeight());
//			repaint();
		break;
		
		case 1:		// Ansicht 1
			setBackground(Color.RED);
			g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
//			repaint();
		break;
		
		case 2: 	// Ansicht 2
			setBackground(Color.BLUE);
			g.drawLine(getWidth()/2, 0, getWidth()/2, getHeight());
//			repaint();
		break;
		
		default:	
			setBackground(Color.GRAY);
//			repaint();
		break;
		
		}

		
	}	
}

Bitte berichtigt mich mit meinem Infomatikvokabular, ich kann solche Tritte gut gebrauchen ;-)

- 3njoyeD -
 

Zurück
Oben