Problem bei GUI...

Crue

Mitglied
Einen guten Tag

Ich hoffe ich stelle hier keine allzu dumme Frage 😀
Ist aber schwer zu vormulieren, aber ich wage mal einen Versuch.

Ich bin gerade dabei java zu lernen. Zur Uebung will ich ein Quizz mit GUI erstellen.
Dies hat auch soweit geklappt, aber nur als ich alles in eine Klasse eingepackt habe.
Bei meinem Versuch dies in mehrere Klassen zu schreiben, tritt bei mir ein Fehler auf.

Hier erstmal wie es aussehen soll :
( dies ist mein funktionierendes Programm, es ist halt nru in einer Klasse)

Hier das Hauptmenu:

hauptmenuew8vqugprs.jpg auf fotos-hochladen.net

Hier mein Quizzteil:

quizzfweb7a4mon.jpg auf fotos-hochladen.net

Bei meinem in mehreren Klassen geschriebenem Programm funktioniert das Hauptmenu gut, nun tritt aber bei dem Quizzteil ein Fehler auf. Es werden nicht alle Buttons angezeigt und diese Buttons sind auch nur sichtbar wenn man mit der Maus ueber sie faehrt:

quizz2vx651boza8.jpg auf fotos-hochladen.net

Nun zu meinem Code:

Die Startklasse:

Java:
package quizz3;

public class Startklasse {

	public static void main(String args[]){
		
		Startfenster Startfenster = new Startfenster("Menue");
		Startfenster.setDefaultCloseOperation(Startfenster.DISPOSE_ON_CLOSE);
		Startfenster.setSize(250,400);
		Startfenster.setLayout(null);
		Startfenster.setVisible(true);

	}
	public static void Quizzfenster(){
		
		Quizzfenster Quizzfenster = new Quizzfenster("Quizz");
		Quizzfenster.setDefaultCloseOperation(Quizzfenster.DISPOSE_ON_CLOSE);
		Quizzfenster.setSize(400,400);
		Quizzfenster.setVisible(true);
		Quizzfenster.setLayout(null);
		
	}
	
}

Nun die Startfensterklasse:

Java:
package quizz3;

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class Startfenster extends JFrame implements ActionListener{
	
	public JButton start;
	public JButton ende;
	public JButton credits;
	public JButton einstellungen;
	
	public Startfenster(String title){
		
		super(title);
		
		start = new JButton("Quiz starten");
		start.setBounds(40,40,160,40);
		start.addActionListener(this);
		add(start);
		
		credits = new JButton("Credits");
		credits.setBounds(40,117,160,40);
		credits.addActionListener(this);
		add(credits);
		
		einstellungen = new JButton("Einstellungen");
		einstellungen.setBounds(40,205,160,40);
		einstellungen.addActionListener(this);
		add(einstellungen);
		
		ende = new JButton("Beenden");
		ende.setBounds(40,275,160,40);
		ende.addActionListener(this);
		add(ende);
		
	}
	public void actionPerformed(ActionEvent e) {

		if(e.getSource()==start){
		
			Startklasse.Quizzfenster();
		}
        if(e.getSource()==credits){
			
		}
        if(e.getSource()==einstellungen){
			
		}
        if(e.getSource()==ende){
			System.exit(0);
		}
		
	}


}

Die Quizzfensterklasse:

Java:
package quizz3;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;




public class Quizzfenster extends JFrame implements ActionListener {
	
	private JButton frage;
	public String Frage;
	private JButton a;
	public String antwort1;
	private JButton b;
	public String antwort2;
	private JButton c;
	public String antwort3;
	private JButton d;
	public String antwort4;
	public int richtig;
	
	public Quizzfenster(String title){
		
	    super(title);
		
		frage = new JButton(Frage);
		frage.setBounds(20,20,340,80);
		frage.addActionListener(this);
        add(frage);
		
		a = new JButton(antwort1);
		a.setBounds(40,200,140,60);
		a.addActionListener(this);
		add(a);
		
		b = new JButton(antwort2);
		b.setBounds(40,270,140,60);
		b.addActionListener(this);
		add(b);
		
		c = new JButton(antwort3);
		c.setBounds(200,200,140,60);
		c.addActionListener(this);
		add(c);
		
		d = new JButton(antwort4);
		d.setBounds(200,270,140,60);
		d.addActionListener(this);
		add(d);
		
	}

	public void Variablenfestlegen(){
		
		
	}
	public void setFrage(){
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		
	}

}

Ich weiss das das Programm noch nicht fertig ist, aber solange die Buttons nicht richtig angezeigt werden lohnt es sich nicht weiter zu arbeiten.

Hier noch meine funktionierendes, aber in nur eine Klasse geschriebenes Quizz:

Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;


public class frame extends JFrame implements ActionListener {
	
	public static JButton start;
	public static JFrame einstellen;
	public static JButton ende;
	public static JButton credits;
	public static JButton einstellungen;
	public static JButton leicht;
	public static JButton mittel;
	public static JButton schwer;
	public String title;
	public static int timer=1;
	public JButton frage;
	public String Frage;
	public JButton a;
	public String antwort1;
	public JButton b;
	public String antwort2;
	public JButton c;
	public String antwort3;
	public JButton d;
	public String antwort4;
	public int richtig;
	public JFrame gui;
	public int punkte=0;
	public JButton punkteanzeige;
	public int schwierig=1;
	public int lives=3;

	

	
	public static void main(String args[]){
		
		frame frame = new frame("Menue");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setSize(250,400);
		
		
		frame.setLayout(null);
		frame.setVisible(true);		
	}
	
	public frame(String title){
		
		super(title);
		
			
		start = new JButton("Quiz starten");
		start.setBounds(40,40,160,40);
		start.addActionListener(this);
		add(start);
		
		credits = new JButton("Credits");
		credits.setBounds(40,117,160,40);
		credits.addActionListener(this);
		add(credits);
		
		einstellungen = new JButton("Einstellungen");
		einstellungen.setBounds(40,205,160,40);
		einstellungen.addActionListener(this);
		add(einstellungen);
		
		ende = new JButton("Beenden");
		ende.setBounds(40,275,160,40);
		ende.addActionListener(this);
		add(ende);
		
		
		
		
	}
	public void gui(){
		
		//Fragen FragenObject = new Fragen();
		//FragenObject.setquestion(Frage, antwort1, antwort2, antwort3, antwort4, richtig);
		
		getQuestion();
		
		
		frage = new JButton(Frage);
		frage.setBounds(20,20,340,80);
		frage.addActionListener(this);
		
		a = new JButton(antwort1);
		a.setBounds(40,200,140,60);
		a.addActionListener(this);
		
		b = new JButton(antwort2);
		b.setBounds(40,270,140,60);
		b.addActionListener(this);
		
		c = new JButton(antwort3);
		c.setBounds(200,200,140,60);
		c.addActionListener(this);
		
		d = new JButton(antwort4);
		d.setBounds(200,270,140,60);
		d.addActionListener(this);
		
		
		JFrame gui = new JFrame("Quizz");
		gui.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		gui.setSize(400,400);
		gui.setVisible(true);
		gui.setLayout(null);
		gui.add(frage);
		gui.add(a);
		gui.add(b);
		gui.add(c);
		gui.add(d);
		gui.add(punkteanzeige);
				
	}
	
	public void einstellen(){
		
		leicht = new JButton("Leicht");
		leicht.setBounds(35,40,180,40);
		leicht.addActionListener(this);
		
		mittel = new JButton("Mittel");
		mittel.setBounds(35,120,180,40);
		mittel.addActionListener(this);
		
		schwer = new JButton("Schwer");
        schwer.setBounds(35,200,180,40);
        schwer.addActionListener(this);
        
		JFrame einstellen= new JFrame("Einstellungen");
		einstellen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		einstellen.setSize(260,320);
		einstellen.setVisible(true);
		einstellen.setLayout(null);
		einstellen.add(leicht);
		einstellen.add(mittel);
		einstellen.add(schwer);
		
	}
	

	

	@Override
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()== start){
		gui();		
		}
		if(e.getSource()==einstellungen){
			einstellen();
		}
		if(e.getSource()==leicht){
			schwierig=1;
		}
		if(e.getSource() ==mittel){
			schwierig=2;
		}
		if(e.getSource()== schwer){
			schwierig=3;
		}
		if(e.getSource()==credits){
			
        Object[] options1 = { "OK"};
			
	    JOptionPane.showOptionDialog(null,"              Programmiert von Christoph !","Information",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options1,options1[0]);
		}
		if(e.getSource()== ende){
			
			System.exit(0);
			
		}
		if(e.getSource()== a){
			if(richtig!=1){
				lives-=1;
				falsch();
			}
			else{
				richtig();
				gui();
			}
		}
        if(e.getSource()== b){
        	if(richtig!=2){
        		lives-=1;
        		falsch();
        	}
        	else{
        		richtig();
        		gui();
        	}
        		
		}
        if(e.getSource()== c){
        if(richtig!=3){
        	lives-=1;
        		falsch();
        	}
        else{
        	richtig();
        	gui();
        }
		}
        if(e.getSource()== d){
        if(richtig!=4){
        	lives-=1;
        	falsch();	
        	}
        else{
        	richtig();
        	gui();
        	
        }
		}
		
		
	}
	public void falsch(){
		if(lives==0){
			gameOver();
		}
		punkte-=1;
		Object[] options = { "OK"};
		JOptionPane.showOptionDialog(null,"         Du hast "+punkte+" Punkt(e)\n         Du hast noch "+lives+" Versuch(e)","Falsch",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options,options[0]);
	}
	public void richtig(){
		if(lives==0){
			gameOver();
		}
		if(schwierig==1){
			punkte+=1;	
		}
		if(schwierig==2){
			punkte+=2;
		}
		if(schwierig==3){
			punkte+=3;
		}
		
		Object[] options = { "OK"};
		JOptionPane.showOptionDialog(null,"Punkte: "+punkte+"            Gut gemacht <3","Richtig",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options,options[0]);
        
		if(punkte>=25){
			Object[] options2 = { "OK"};
			JOptionPane.showOptionDialog(null,"Du hast das Quizz mit "+punkte+" Punkt(e) erfolgreich bestanden.","Gratulation",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options2,options2[0]);
			warten(1000);
			System.exit(0);
		}
		
		
	}
	public void gameOver(){
		
		Object[] options4 = { "OK"};
		punkte=0;
		JOptionPane.showOptionDialog(null,"DU hast Versagt","Versager",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,options4,options4[0]);
		warten(2000);
		System.exit(0);
		
	}
	
	public static void warten(int time){
		try{
			Thread.sleep(time);
		}catch(Exception e){
			
		}
	} 
    public void getQuestion(){
    	
    	if(schwierig==1){
    		
		
		Random rand = new Random();
		int zahl=rand.nextInt(8);
		richtig=0;
		switch(zahl){
		case 0:
			Frage = "Was ist keine Kinderkrankheit?";
			antwort1 = "Masern";
			antwort2 = "Seepoken";
			antwort3 = "Mumps";
			antwort4 = "Roeteln";
			richtig=2;
			break;
		case 1:
			Frage = "Haeufigste Todesursache in der Wueste";
			antwort1 = "Ertrinken";
			antwort2 = "Verhungern";
			antwort3 = "Verdursten";
			antwort4 = "Erfrieren";
			richtig=1;
			break;
		case 2:
			Frage = "Was schmeckt man auf der Zungenspitze?";
			antwort1 = "Bitter";
			antwort2 = "Salzig";
			antwort3 = "Suess";
			antwort4 = "Sauer";
			richtig=3;
			break;
		case 3:
			Frage = "Wodurch trocknet Sekundenkleber?";
			antwort1 = "Sauerstoff";
			antwort2 = "Feuchtigkeit";
			antwort3 = "Waerme";
			antwort4 = "Kaelte";
			richtig=2;
			break;
		case 4:
			Frage = "Welche europäische Stadt hat die meisten Brücken?";
			antwort1 = "Hamburg";
			antwort2 = "Venedig";
			antwort3 = "Amsterdam";
			antwort4 = "Berlin";
			richtig=1;
			break;
		case 5:
			Frage = "Anzahl der Bundeslaender in Deutschland?";
			antwort1 = "14 Bundesländer";
			antwort2 = "16 Bundesländer";
			antwort3 = "20 Bundesländer";
			antwort4 = "15 Bundesländer";
			richtig=2;
			break;
		case 6:
			Frage = "Wie viel PS hat ein Pferd ?";
			antwort1 = "unter 0.1PS";
			antwort2 = "1PS";
			antwort3 = "2PS";
			antwort4 = "10PS";
			richtig=4;
			break;
		case 7:
			Frage = "Wo befindet sich der Hauptsitz der UNESCO?";
			antwort1 = "Brüssel";
			antwort2 = "Paris";
			antwort3 = "London";
			antwort4 = "Helsinki";
			richtig=2;
			break;
			default:
				Frage = "There was an error !!!";
				antwort1 = "There was an error !!!";
				antwort2 = "There was an error !!!";
				antwort3 = "There was an error !!!";
				antwort4 = "There was an error !!!";
				break;
				
		}
    	}
    	if(schwierig==2){
    		Random rand = new Random();
    		int zahl=rand.nextInt(8);
    		richtig=0;
    		switch(zahl){
    		case 0:
    			Frage = "Was ist keine Kinderkrankheit?";
    			antwort1 = "Masern";
    			antwort2 = "Seepoken";
    			antwort3 = "Mumps";
    			antwort4 = "Roeteln";
    			richtig=2;
    			break;
    		case 1:
    			Frage = "Die Wurzel aus 49";
    			antwort1 = "24.5";
    			antwort2 = "9";
    			antwort3 = "7";
    			antwort4 = "nicht moeglich";
    			richtig=3;
    			break;
    		case 2:
    			Frage = "Was schmeckt man auf der Zungenspitze?";
    			antwort1 = "Bitter";
    			antwort2 = "Salzig";
    			antwort3 = "Suess";
    			antwort4 = "Sauer";
    			richtig=3;
    			break;
    		case 3:
    			Frage = "Wodurch trocknet Sekundenkleber?";
    			antwort1 = "Sauerstoff";
    			antwort2 = "Feuchtigkeit";
    			antwort3 = "Waerme";
    			antwort4 = "Kaelte";
    			richtig=2;
    			break;
    		case 4:
    			Frage = "Welche europäische Stadt hat die meisten Brücken?";
    			antwort1 = "Hamburg";
    			antwort2 = "Venedig";
    			antwort3 = "Amsterdam";
    			antwort4 = "Berlin";
    			richtig=1;
    			break;
    		case 5:
    			Frage = "Was bekam man beim ersten Münzautomat?";
    			antwort1 = "Kaugummi";
    			antwort2 = "Schokolade";
    			antwort3 = "Wasser";
    			antwort4 = "Brot";
    			richtig=3;
    			break;
    		case 6:
    			Frage = "Wie lange schläft ein Faultier pro Tag?";
    			antwort1 = "15 Stunden";
    			antwort2 = "24 Stunden";
    			antwort3 = "30 Minuten";
    			antwort4 = "12 Stunden";
    			richtig=1;
    			break;
    		case 7:
    			Frage = "Was ist die Amtssprache von Mexiko?";
    			antwort1 = "Portugiesisch";
    			antwort2 = "Englisch";
    			antwort3 = "Französisch";
    			antwort4 = "Spanisch";
    			richtig=4;
    			break;
    			
    			default:
    				Frage = "There was an error !!!";
    				antwort1 = "There was an error !!!";
    				antwort2 = "There was an error !!!";
    				antwort3 = "There was an error !!!";
    				antwort4 = "There was an error !!!";
    				break;
    				
    		}	
    		
    	}
    	if(schwierig==3){
    		Random rand = new Random();
    		int zahl=rand.nextInt(9);
    		richtig=0;
    		switch(zahl){
    		case 0:
    			Frage = "Wann wurde die Sommerzeit eingeführt?";
    			antwort1 = "06. April 1980";
    			antwort2 = "01. Januar 1983";
    			antwort3 = "08. September 1982";
    			antwort4 = "14. Oktober 1986";
    			richtig=1;
    			break;
    		case 1:
    			Frage = "Welcher Fluss mündet in die Nordsee?";
    			antwort1 = "Mosel";
    			antwort2 = "Oder";
    			antwort3 = "Ems";
    			antwort4 = "Maas";
    			richtig=3;
    			break;
    		case 2:
    			Frage = "Was ist ein Merkmal postmoderner Sportkultur?";
    			antwort1 = "Vereinheitlichung";
    			antwort2 = "Anerkennung der Antike";
    			antwort3 = "Vielfältigkeit";
    			antwort4 = "Homogenität";
    			richtig=3;
    			break;
    		case 3:
    			Frage = "Wodurch trocknet Sekundenkleber?";
    			antwort1 = "Sauerstoff";
    			antwort2 = "Feuchtigkeit";
    			antwort3 = "Waerme";
    			antwort4 = "Kaelte";
    			richtig=2;
    			break;
    		case 4:
    			Frage = "Welche europäische Stadt hat die meisten Brücken?";
    			antwort1 = "Hamburg";
    			antwort2 = "Venedig";
    			antwort3 = "Amsterdam";
    			antwort4 = "Berlin";
    			richtig=1;
    			break;
    		case 5:
    			Frage = "Was bekam man beim ersten Münzautomat?";
    			antwort1 = "Kaugummi";
    			antwort2 = "Schokolade";
    			antwort3 = "Wasser";
    			antwort4 = "Brot";
    			richtig=3;
    			break;
    		case 6:
    			Frage = "Wie viel PS hat ein Pferd ?";
    			antwort1 = "unter 0.1PS";
    			antwort2 = "1PS";
    			antwort3 = "2PS";
    			antwort4 = "10PS";
    			richtig=4;
    			break;
    		case 7:
    			Frage = "Welches Gebirge liegt direkt am Rhein?";
    			antwort1 = "Rhön";
    			antwort2 = "Taunus";
    			antwort3 = "Erzgebirge";
    			antwort4 = "Spessart";
    			richtig=2;
    			break;
    		case 8:
    			Frage = "Was ist ein Rebus??";
    			antwort1 = "Kreditinstitut";
    			antwort2 = "Werkzeug";
    			antwort3 = "Weinstock";
    			antwort4 = "Bilderrätsel";
    			richtig=4;
    			break;
    		case 9:
    			Frage = "Was ist ein Rebus??";
    			antwort1 = "Kreditinstitut";
    			antwort2 = "Werkzeug";
    			antwort3 = "Weinstock";
    			antwort4 = "Bilderrätsel";
    			richtig=4;
    			break;
    			default:
    				Frage = "There was an error !!!";
    				antwort1 = "There was an error !!!";
    				antwort2 = "There was an error !!!";
    				antwort3 = "There was an error !!!";
    				antwort4 = "There was an error !!!";
    				break;
    				
    		}
    	}
		
	}
	

}

Entschuldigung fuer diesen langen post, aber Bitte Bitte Helft mir.

MfG
 
Für so langen Code bitte Spoilertags verwenden.

Java:
Quizzfenster.setVisible(true);
        Quizzfenster.setLayout(null);

Tausch diese beiden Aufrufe um, so dass der setLayout-Aufruf oben steht.

Aber anhand deines Codes kann ich sehen, dass du ALLE Grundlagen übersprungen hast.
GUI ist eine Sache, aber für das auslagern von Code, sollte man die Objekt-Orientierten-Prinzipien kennen und nicht wahllos mal eine Variable public, die andere private und andere wiederum static.

Wenn du nicht in spätestens 1-2 Monaten die Lust verlieren willst, solltest du dich mit den Grundlagen auseinandersetzen.
Ist zwar langweilig, aber du wirst sehen, wie viel leichter und lustiger es wird, wenn du wirklich weißt was Sache ist.
 
Zum Thema Grundlagen: Ich hab java in der Schule, wo ich diese lerne.

Zum anderen mit dem durcheinander mit public und private, das liegt daran, dass ich so verzweifelt war, dass ich einfach irgendwas verändert habe und in der Hoffnung war es würde irgendwas ändern....(ich weiss ist nicht sonderlich intelligent, aber egal)
 
dein code weißt typische anfängerprobleme auf.
fürs erste solltest du am besten ein quiz in der console programmieren um die grundlagen zu verstehen.
wenn du dir deinen code ansiehst bemerkst du sicher, dass viele befehle öfters vorkommen. das ist ein typisches zeichen für fehlende objektorientierung.

fang doch ganz einfach an:

eine klasse antwort beinhaltet einen text und eine boolsche variable 'richtig'
eine klasse frage beinhaltet einen text und vier antworten, von denen eine richtig ist und eine id die einzigartig ist und beim erzeugen vergeben wird

ein feld im hauptprogramm beinhaltet dann beliebig viele fragen

dann kannst du random eine ausgeben lassen und per input mit ziffern von 1 bis 4 beantworten.

mit solchen minimalbeispielen kannst du dir eine kernfunktionalität erarbeiten. danach kann man an die gui gehen.
 
Zuletzt bearbeitet:
Danke fuer deinen tip :toll:

Das mein Code soviele Anfaengerfehler aufweist ahbe ich mir gedacht, ich habe mir auch nicht ganz so viel muehe gegeben, wollte es nur grob zum laufen bringen, die feinheiten kommen danach.

Nun ist mein Quizz fertig, auch moeglichst viele Anfaengerfehler behoben(hoffe ich 😀, kann zumindest keine ausmachen 🙂 ).
 
Ist mir noch nicht aufgefallen :lol:

Danke für diesen Hinweis :toll:
Und Entschuldigung dass du so etwas lesen musstest.

MfG

Chris
 
Das kommt noch. Erst mal irgendwie, später weiß man wie blöde es war 🙂
Ein Zeichen das bei Anfängern etwas schief ging ist "static" und "final", meist werden diese Dinge von Eclipse korrigiert weil irgendwo im Code die Objektorientierung nicht stimmt.

Static bei einer Feld Variable heißt z.B. dass egal wie viele Instanzen von einer Klasse du machst (new...), es gibt für alle nur ein und die selbe Variable. Das ist ein Objektorientierungskiller.

Ein Objekt einer Klasse soll eigenständig sein. D.h. mit jedem new... bekommt eine Instanz/Objekt seine eigenen Kopien der Werte und Methoden.
 
Zuletzt bearbeitet:

Zurück
Oben