JFrame neu laden

blade_mz

Mitglied
Moin,

ich komme gerade mit meinem ersten kleinen Projekt nicht weiter. Es soll ein kleines Prüfprogramm für Signalflaggen werden.

Ich habe es soweit selbst hinbekommen, dass der erste Durchlauf angezeigt wird. Wenn ich nun aber die richtige Antwort ausgewählt habe würde ich gerne einen neuen Durchlauf starten. Hierzu habe ich bereits die repaint() Methode gefunden, weiss aber nicht genau, wie ich sie anwenden soll. ein einfaches

Code:
 mainpr.repaint();

in actionperformed tut es auf jeden Fall nicht.

Über Hilfe wäre ich sehr glücklich.

Schönen Gruß




Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;

public class quizframe extends JFrame implements ActionListener
{

	
	//Definieren der Objekte
	
	int[] Zufallszahl= new int[3];
	JLabel Ueberschrift  = new JLabel("Signalflaggen Lernprogramm");
	JLabel Flaggelabel = new JLabel();
	JLabel Ergebnislabel = new JLabel();
	
	
	JButton L1 = new JButton();
	JButton L2 = new JButton();
	JButton L3 = new JButton();

	
	//Definieren der Panels
	JPanel Kopfpanel = new JPanel();
	JPanel Flaggenpanel = new JPanel();
	JPanel Loesungspanel = new JPanel();
	JPanel Ergebnispanel = new JPanel();	

	
	//Konstruktor
	public quizframe (String title, String[][] Flaggenliste, int[] Zufallszahl, int richtigeantwort)
	{
		super(title);

		Ueberschrift.setFont(new Font("Courier New",Font.BOLD, 25));
		Kopfpanel.add(Ueberschrift);

		Flaggenpanel.setLayout( new BoxLayout(Flaggenpanel, BoxLayout.Y_AXIS));
		Flaggelabel.setIcon(Flaggedarstellen(Flaggenliste[richtigeantwort][0]));
		
		Flaggenpanel.add(Flaggelabel); 
	
		Loesungspanel.setLayout( new BoxLayout(Loesungspanel, BoxLayout.Y_AXIS));
		Font Loesungsbuttonfont = new Font("Arial", Font.BOLD, 48);
		
		L1.setText(Flaggenliste[Zufallszahl[0]][1].toString());
		L2.setText(Flaggenliste[Zufallszahl[1]][1].toString());
		L3.setText(Flaggenliste[Zufallszahl[2]][1].toString());
		
		if (Zufallszahl[0] == richtigeantwort)
			L1.setActionCommand("richtig");
		else
			L1.setActionCommand("falsch");
		
		if (Zufallszahl[1] == richtigeantwort)
			L2.setActionCommand("richtig");
		else
			L2.setActionCommand("falsch");
		
		if (Zufallszahl[2] == richtigeantwort)
			L3.setActionCommand("richtig");
		else
			L3.setActionCommand("falsch");

		L1.addActionListener(this);
		L2.addActionListener(this);
		L3.addActionListener(this);

		L1.setFont(Loesungsbuttonfont);
		L2.setFont(Loesungsbuttonfont);		
		L3.setFont(Loesungsbuttonfont);
		Loesungspanel.add(L1);
		Loesungspanel.add(L2);
		Loesungspanel.add(L3);
		
		Font Ergebnisfont = new Font("Comic Sans", Font.BOLD, 30);
		Ergebnislabel.setFont(Ergebnisfont);
		Ergebnispanel.add(Ergebnislabel);
		
		add (Kopfpanel,BorderLayout.NORTH);
		add (Loesungspanel,BorderLayout.EAST);
		add (Flaggenpanel,BorderLayout.WEST);
		add (Ergebnispanel, BorderLayout.SOUTH);
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	}
	
	/*Automatisches Einlesen der Bilder
	 * 
	 * Diese Methode liest das Verzeichnis "Flaggen" ein und speichert die Dateinamen
	 * in einem Array. Zusätzlich verknüpft es jede Flagge mit einer fortlaufenden
	 * Nummer
	 */
	public static String[][] einlesen(String verzeichnis)
	{
		File f = new File(verzeichnis);
		File[] fileArray = f.listFiles();
		int filezaehler = fileArray.length;
		String [][] Flaglist = new String[filezaehler][2];
		for (int i = 0; i < fileArray.length; i++)  
			{
			String filename = fileArray[i].toString();
			String[] filesplit = filename.split("\\\\");
			String firstletter = filesplit[1].toString().substring(0,1);
			String[] filesplit2 = filesplit[1].split("\\.");
			String rest = filesplit2[0].toString().substring(1);
			String anzeigename = firstletter.toUpperCase() + rest.toLowerCase();
			
			
			Flaglist[i][0]=fileArray[i].toString(); 
			Flaglist[i][1]= anzeigename;
			}

		return Flaglist;
	}
		
	/* Einbinden der Bilder. Diese Version unterstützt ebenfalls ein rescaling.
	 * Dies muss in der endgültigen Version nicht drin sein, wenn alle Bilder 
	 * eine anständige Größe besitzen.
	 */
	public ImageIcon Flaggedarstellen(String verzeichnis)
	{
	MediaTracker tracker = new MediaTracker(this);
	Image flaggeori = getToolkit().getImage(verzeichnis);
	tracker.addImage(flaggeori, 0);
	     try {
	       //Warten, bis das Image vollständig geladen ist,
	       //damit getWidth() und getHeight() funktionieren
	       tracker.waitForAll();
	     } catch (InterruptedException e) {

	     }
	int oriheight=flaggeori.getHeight(this);
	int oriwidth =flaggeori.getWidth(this);
	int verhaeltnis= 150;
	int width =  verhaeltnis * oriwidth / 100;
	int height = verhaeltnis * oriheight / 100;	
	Image flaggescaled = flaggeori.getScaledInstance(width,height,flaggeori.SCALE_SMOOTH);
	ImageIcon ausgabe = new ImageIcon(flaggescaled);
	
	return ausgabe;
	}
	
	

	
	public static int Richtig(int[] Auswahl)
	{
	 int i = (int)(Math.random()*3+1);
	 i--;
	 return Auswahl[i];
		
	}
	
	public static int[] Zufall(String[][] Flaggenarray)
	{
		String[] Wuerfel = new String[Flaggenarray.length];
		for (int i = 0; i < Flaggenarray.length; i++)
		{
			Wuerfel[i] = "" + i;
		}
		List<String> liste = Arrays.asList(Wuerfel);
		
		Collections.shuffle(liste);
		
		int[] Ergebnis = new int[3];
		
		Ergebnis[0] = Integer.parseInt(Wuerfel[0]);
		Ergebnis[1] = Integer.parseInt(Wuerfel[1]);
		Ergebnis[2] = Integer.parseInt(Wuerfel[2]);
		
		return Ergebnis;
	}
	
	public static String[][] getFlaggenliste()
		{
		return einlesen("Flaggen");
		}
	
	public void setZufallszahl()
	{
		String[][] Flaggenliste = getFlaggenliste();
		Zufallszahl = Zufall(Flaggenliste);
	}
	
	public static quizframe startprogramm()
	{
		String[][] Flaggenliste = getFlaggenliste();
		int[] Zufallszahl= new int[3];
		Zufallszahl = Zufall(Flaggenliste);
		int richtigeantwort = Richtig(Zufallszahl);
		quizframe mainpr  = new quizframe( "Signalflaggen Lernprogramm", Flaggenliste, Zufallszahl, richtigeantwort ) ;
		return mainpr;
	}
	


	  public void actionPerformed( ActionEvent evt)
	  {
		  if (evt.getActionCommand().equals("richtig"))
		  {
			  Ergebnislabel.setText("Diese Antwort ist richtig");
	//		  mainpr.repaint();
		  }
		  else
			  Ergebnislabel.setText("FALSCH!!");
		  
	    repaint();
	  }
	
	  public static void main ( String[] args )
	  {
		quizframe mainpr = startprogramm();

	    mainpr.setSize( 500,400 );
	    mainpr.setResizable( false ); 
	    mainpr.setVisible( true );
	    mainpr.repaint();
	  }
	  

}
 
wenn du auf editieren, oder antworten gehst...hast du -etwas weiter unten- die Möglichkeit eine Datei anzuhängen, musst halt den Ordner noch vorher mit 7zip, oder winrar oder oder packen

edit habe ich so auch noch nicht gemacht...hoffentlich klappt das^^

jepp klappt 🙂
 

Anhänge

evtl. kann dir jemand anders geschickter proggen...aber da du vieles in deinem Konstruktor machst und ich heute auch keine Lust mehr habe^^ (sorry) kann ich dir nur diese Lösung anbieten...die natürlich alles andere als geschickt ist...aber funktioniert 😉
das ist natürlich eigentlich bullshit...


Java:
package gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.Collections;

public class quizframe extends JFrame implements ActionListener {

	// Definieren der Objekte
	static quizframe mainpr;

	int[] Zufallszahl = new int[3];
	JLabel Ueberschrift = new JLabel("Signalflaggen Lernprogramm");
	JLabel Flaggelabel = new JLabel();
	JLabel Ergebnislabel = new JLabel();

	JButton L1 = new JButton();
	JButton L2 = new JButton();
	JButton L3 = new JButton();

	// Definieren der Panels
	JPanel Kopfpanel = new JPanel();
	JPanel Flaggenpanel = new JPanel();
	JPanel Loesungspanel = new JPanel();
	JPanel Ergebnispanel = new JPanel();

	// Konstruktor
	public quizframe(String title, String[][] Flaggenliste, int[] Zufallszahl,
			int richtigeantwort) {
		super(title);

		Ueberschrift.setFont(new Font("Courier New", Font.BOLD, 25));
		Kopfpanel.add(Ueberschrift);

		Flaggenpanel.setLayout(new BoxLayout(Flaggenpanel, BoxLayout.Y_AXIS));
		Flaggelabel.setIcon(Flaggedarstellen(Flaggenliste[richtigeantwort][0]));

		Flaggenpanel.add(Flaggelabel);

		Loesungspanel.setLayout(new BoxLayout(Loesungspanel, BoxLayout.Y_AXIS));
		Font Loesungsbuttonfont = new Font("Arial", Font.BOLD, 48);

		L1.setText(Flaggenliste[Zufallszahl[0]][1].toString());
		L2.setText(Flaggenliste[Zufallszahl[1]][1].toString());
		L3.setText(Flaggenliste[Zufallszahl[2]][1].toString());

		if (Zufallszahl[0] == richtigeantwort)
			L1.setActionCommand("richtig");
		else
			L1.setActionCommand("falsch");

		if (Zufallszahl[1] == richtigeantwort)
			L2.setActionCommand("richtig");
		else
			L2.setActionCommand("falsch");

		if (Zufallszahl[2] == richtigeantwort)
			L3.setActionCommand("richtig");
		else
			L3.setActionCommand("falsch");

		L1.addActionListener(this);
		L2.addActionListener(this);
		L3.addActionListener(this);

		L1.setFont(Loesungsbuttonfont);
		L2.setFont(Loesungsbuttonfont);
		L3.setFont(Loesungsbuttonfont);
		Loesungspanel.add(L1);
		Loesungspanel.add(L2);
		Loesungspanel.add(L3);

		Font Ergebnisfont = new Font("Comic Sans", Font.BOLD, 30);
		Ergebnislabel.setFont(Ergebnisfont);
		Ergebnispanel.add(Ergebnislabel);

		add(Kopfpanel, BorderLayout.NORTH);
		add(Loesungspanel, BorderLayout.EAST);
		add(Flaggenpanel, BorderLayout.WEST);
		add(Ergebnispanel, BorderLayout.SOUTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	/*
	 * Automatisches Einlesen der Bilder
	 * 
	 * Diese Methode liest das Verzeichnis "Flaggen" ein und speichert die
	 * Dateinamen in einem Array. Zusätzlich verknüpft es jede Flagge mit einer
	 * fortlaufenden Nummer
	 */
	public static String[][] einlesen(String verzeichnis) {
		File f = new File(verzeichnis);
		File[] fileArray = f.listFiles();
		int filezaehler = fileArray.length;
		String[][] Flaglist = new String[filezaehler][2];
		for (int i = 0; i < fileArray.length; i++) {
			String filename = fileArray[i].toString();
			String[] filesplit = filename.split("\\\\");
			String firstletter = filesplit[1].toString().substring(0, 1);
			String[] filesplit2 = filesplit[1].split("\\.");
			String rest = filesplit2[0].toString().substring(1);
			String anzeigename = firstletter.toUpperCase() + rest.toLowerCase();

			Flaglist[i][0] = fileArray[i].toString();
			Flaglist[i][1] = anzeigename;
		}

		return Flaglist;
	}

	/*
	 * Einbinden der Bilder. Diese Version unterstützt ebenfalls ein rescaling.
	 * Dies muss in der endgültigen Version nicht drin sein, wenn alle Bilder
	 * eine anständige Größe besitzen.
	 */
	public ImageIcon Flaggedarstellen(String verzeichnis) {
		MediaTracker tracker = new MediaTracker(this);
		Image flaggeori = getToolkit().getImage(verzeichnis);
		tracker.addImage(flaggeori, 0);
		try {
			// Warten, bis das Image vollständig geladen ist,
			// damit getWidth() und getHeight() funktionieren
			tracker.waitForAll();
		} catch (InterruptedException e) {

		}
		int oriheight = flaggeori.getHeight(this);
		int oriwidth = flaggeori.getWidth(this);
		int verhaeltnis = 150;
		int width = verhaeltnis * oriwidth / 100;
		int height = verhaeltnis * oriheight / 100;
		Image flaggescaled = flaggeori.getScaledInstance(width, height,
				flaggeori.SCALE_SMOOTH);
		ImageIcon ausgabe = new ImageIcon(flaggescaled);

		return ausgabe;
	}

	public static int Richtig(int[] Auswahl) {
		int i = (int) (Math.random() * 3 + 1);
		i--;
		return Auswahl[i];

	}

	public static int[] Zufall(String[][] Flaggenarray) {
		String[] Wuerfel = new String[Flaggenarray.length];
		for (int i = 0; i < Flaggenarray.length; i++) {
			Wuerfel[i] = "" + i;
		}
		List<String> liste = Arrays.asList(Wuerfel);

		Collections.shuffle(liste);

		int[] Ergebnis = new int[3];

		Ergebnis[0] = Integer.parseInt(Wuerfel[0]);
		Ergebnis[1] = Integer.parseInt(Wuerfel[1]);
		Ergebnis[2] = Integer.parseInt(Wuerfel[2]);

		return Ergebnis;
	}

	public static String[][] getFlaggenliste() {
		return einlesen("Flaggen");
	}

	public void setZufallszahl() {
		String[][] Flaggenliste = getFlaggenliste();
		Zufallszahl = Zufall(Flaggenliste);
	}

	public static quizframe startprogramm() {
		String[][] Flaggenliste = getFlaggenliste();
		int[] Zufallszahl = new int[3];
		Zufallszahl = Zufall(Flaggenliste);
		int richtigeantwort = Richtig(Zufallszahl);
		quizframe mainpr = new quizframe("Signalflaggen Lernprogramm",
				Flaggenliste, Zufallszahl, richtigeantwort);
		return mainpr;
	}

	public void actionPerformed(ActionEvent evt) {
		if (evt.getActionCommand().equals("richtig")) {
			Ergebnislabel.setText("Diese Antwort ist richtig");
			weitereFrage();
		} else
			Ergebnislabel.setText("FALSCH!!");

	}

	private void weitereFrage() {
		Object[] options = { "Ja", "Nein" };
		int selected = JOptionPane.showOptionDialog(this,
				"Wollen Sie eine weitere Frage?", "weitere Frage",
				JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
				null, options, options[0]);
		if (selected == 0) {
			mainpr.dispose();
			mainpr.setSize(500, 400);
			mainpr.setLocationRelativeTo(null);
			mainpr.setResizable(false);
			mainpr.setVisible(true);
		} else {
			// was auch immer...
			System.exit(0);
		}
	}

	public static void main(String[] args) {
		mainpr = startprogramm();

		mainpr.setSize(500, 400);
		mainpr.setLocationRelativeTo(null);
		mainpr.setResizable(false);
		mainpr.setVisible(true);
	}

}
 
moin,

so etwas ähnliches hatte ich auch schonmal. Ich such aber eigentlich eine Möglichkeit ohne den aktuellen JFrame zu schließen und einen neuen JFrame zu öffnen. Ich würde gerne nur die Werte überschreiben und die JLabel dann aktualisieren.

Schönen Gruß
 
wie wäre es mit einer Methode reset(JQuizFrame frame)
wo du dann alle Einstellungen/Parameter wieder auf den Ursprungszustand zurücksetzt.
 

Neue Themen


Zurück
Oben