Schleife tut nicht was sie soll

Ich bin dabei ein Jframe sich öffnen zulassen und wenn die Zahl stimmt soll er das Programm beenden. Wenn er falsch liegt soll sich der JFrame nochmal öffnen. Aber Anstatt nochmal ihn zu erstellen erstellt er 4-5 Stück.

Hier der Code (abgewandelt):

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class game3d { // eigentlich wollen wir groß geschriebene Klassennamen...
    int eingabe= 0;
    int zahl2 = 0;
	int versuche = 0;
	Random zufallszahl = new Random();
	
	

	
  public static void main(String[] args)
  {
      // Java ist eine objektorientierte Sprache, also erzeugen wir ein Objekt
          // und rufen eine seiner Methoden auf.
	  //Klasse selber rennen lassen
          new game3d().run();
  }
     
  private void run() 
{
	

	  
 do
 {
	  
    JFrame frame = new JFrame("LuckyGame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
    
    BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS); // top to bottom
    frame.setSize(230, 110);
    frame.setLayout(boxLayout);
    frame.setResizable(false);
    
    
    zahl2 = zufallszahl.nextInt(11);
    
    final JTextField field1 = new JTextField(18); 
    
    JPanel Monitorpanel = new JPanel();/*Panel adden (extra container)*/
    Monitorpanel.add(field1);
    
    frame.add(Monitorpanel); /*Ab hier wieder adden*/
    /*adden beendet*/
    
    
    
    field1.addActionListener(new ActionListener()
    {        /*actionlistener erstellt*/
    	 
        @Override
        public void actionPerformed(ActionEvent e) 
        {  
        	//String to int convert zahl1 hier erstellt
        	int zahl1 = Integer.parseInt(field1.getText());
            //Hier soll int Zahl1 ausgegeben werden
            eingabe = zahl1; 
            System.exit(0);
        }
        
    }
    );/*actionlistener beendet*/
    

    
   
    
    frame.setVisible(true);
 }while( eingabe != zahl2 );
}
  
  
  
  
  
  
}

du hast ja keinerlei wartezeit oder so. die while schleife laeuft staendig und solange eingabe nicht der zahl ist.

Da gibt es keine pause, er wartet nicht bis du irgendwas machst, sondern rennt los und irgendwann ist mal eingabe gleich der zahl und dann ist er vorbei.

also im grunde - weg mit der while schleife und im ActionListener die Zahl ueberpruefen. Ist sie gleich, aus… ist sies nicht, mach nix und der user muss neu eingeben.

Du brauchst ja auch keine zig frames, einer reicht

Und wie mache ich das am besten?

Wenn es falsch ist soll er den jetztigen schliessen (das macht er schon) dannach ein neuen kreieren wo drauf steht die Zahl ** ist falsch.
und dann neustarten.

Wenn es richtig ist soll er den jetztigen schliessen (das macht er schon) dannach ein neuen kreieren wo drauf steht die Zahl ** ist richtig,
sie haben ** Versuche gebraucht.

Mit freundlichem Gruß,
MrSmile07

warum willst du immer einen komplett neuen Frame erstellen ?

Nimm einen Frame. Auf dem ist ein JLabel drauf und ein JTextField.

Der user gibt eine Zahl ins Textfeld, ist es richtig schreibst du ins label “richtig, xxx versuche”. Ansonsten “falsch, probieren sie es nochmal”.

Wie gesagt, nicht immer neue Frames oeffnen, es geht wesentlich simpler

Ich habe aber schon (nicht im Quelltext zu sehen) schon JLabels erstellt und wie blende ich die aus und zeige die anderen an.
Und wie starte ich es wenn es falsch ist automatisch neu?

Mit freundlichem Gruß,
MrSmile07

Farme.setVisible(true) blockiert nicht.
Für Deinen Fall wäre ein [JAPI]JOptionPane[/JAPI] die bessere Wahl: String eingabe = JOptionPane.showInputDialog("gib was ein");Damit geht’s erst weiter, wenn der Anwender den Dialog schließt.

bye
TT

Das ist nicht mein Problem wenn ich was eingebe und “enter” drücke gehts ja weiter meine frage ist.
Wie kann ich das Programm von vorne anfangen lassen ohne es mannuell neustarten zumüssen.

Mit freundlichem Gruß,
MrSmile07

[QUOTE=MrSmile07]Wenn es falsch ist soll er den jetztigen schliessen (das macht er schon) dannach ein neuen kreieren wo drauf steht die Zahl ** ist falsch.
und dann neustarten.[/QUOTE]Du musst Dir merken, wie oft Du schon in der Schleife warst, und ab dem 2. mal den Anzeige-Text ändern.

[QUOTE=MrSmile07;29134]Wenn es richtig ist soll er den jetztigen schliessen (das macht er schon) dannach ein neuen kreieren wo drauf steht die Zahl ** ist richtig,
sie haben ** Versuche gebraucht.[/QUOTE]Du braucht einen zusätzlichen Dialog (auch hier ist [japi]JOptionPane[/japi] dein Freund) am Ende der Methode run.

[QUOTE=MrSmile07;29145]Das ist nicht mein Problem wenn ich was eingebe und “enter” drücke gehts ja weiter meine frage ist.
Wie kann ich das Programm von vorne anfangen lassen ohne es mannuell neustarten zumüssen.[/QUOTE]
Für sich wiederholende Abläufe gibt es in Java Schleifen. Eine davon hast Du ja schon angewendet.

bye
TT

[QUOTE=Timothy_Truckle;29156]Du musst Dir merken, wie oft Du schon in der Schleife warst, und ab dem 2. mal den Anzeige-Text ändern.
[/QUOTE]

Zu merken wie oft ich in der Schleife war habe ich kein Problem.

ich arbeite nicht gerne mit [japi]JOptionPane[/japi].

Die Schleife erstellt wie gesagt 4-5 neue Fenster. Sie soll aber auf die Eingabe warten bis er die Eingabe überprüft.

Mit freundlichem Gruß,
MrSmile07

Die Lösungen für beide Probleme sind bereits ausgeführt.
Du musst die Antworten nur noch mit Deinen Fragen zusammenbringen.

bye
TT

Meine eigentliche Frage war wie ich eine Schleife erstelle die wartet bis ich etwas eingegeben habe. Und wenn es nicht richtig ist von vorne Anfängt. Insgesammt fehlt mir nur der “pausieren Befehl” und der “von vorn Befehl”.

Mit freundlichem Gruß,
MrSmile07

[QUOTE=MrSmile07] Insgesammt fehlt mir nur der “pausieren Befehl”[/QUOTE]Antwort #6

[QUOTE=MrSmile07;29176] und der “von vorn Befehl”.[/QUOTE]Antwort #8 letzter Satz.

Wenn Du dass jetzt nicht selbst umsetzten kannst solltest Du Dir das mit der Programmierer-Kariere noch mal überlegen.

bye
TT

Ich halte es für kritisch sich mit einer GUI zu beschäftigen solange man noch Probleme bei den Grundlagen hat.
Aber egal. Schreibe die Applikation erst einmal ohne GUI es werden solange Eingaben gelesen bis die richtige Zahl erraten ist. Strukturiere den Code sauber und unterteile ihn in wieder verwendbare Methoden. Erst im zweiten Schritt erstellst Du die GUI und kombinierst diese mit der Applikation.

Warum sofort mehrere Frames erstellt werden? Weil die Schleife ungehindert läuft solange die Bedingung nicht erfüllt ist.
In Kombination mit einer GUI ist die Schleife völliger Schwachsinn. Eine GUI reagiert auf Benutzeraktionen. Dafür hast Du ja den ActionListener. Hier musst Du ja nur eine Fallunterscheidung machen: Richtig geraten ==> Programm beenden, Falsch geraten ==> Mitteilung an Anwender, evtl. Felder zurücksetzen und den Benutzer einfach nur neu raten lassen.

@michael ich habe die Konsolen anwendung schon fertig (da gibt es aber nicht so viele probleme). Das neu raten lassen ist mein Problem.

@Timothy_Truckle wie ich bereits schon erwähnt hatte möchte ich kein JOptionPane Dialog und die Schleife ist auch nicht des Rätsels lösung.

Mit freundlichem Gruß,
MrSmile07

Und das neu Raten auf der Konsole funktioniert? Wie hast Du es da implementiert, hast Du den Code einigermaßen unterteilt?

Hier war der Code (verschwand innerhalb 2 min)

Mit freundlichem Gruß,
MrSmile07

Aber wie gesagt es funktionierte in der Konsole und ich probiere jetzt das Programm zu einem gui umzubauen.

Mit freundlichem Gruß,
MrSmile07

[QUOTE=MrSmile07]@michael ich habe die Konsolen anwendung schon fertig (da gibt es aber nicht so viele probleme). Das neu raten lassen ist mein Problem.[/QUOTE]Also eigentlich, wie man eine Schleife einsetzt…

[QUOTE=MrSmile07;29187] @Timothy_Truckle wie ich bereits schon erwähnt hatte möchte ich kein JOptionPane Dialog[/QUOTE]was Du möchtest ist ein blockierender Dialog. Wenn Du die JOP ablehnst musst Du das Warten eben selbst implementieren.

[QUOTE=MrSmile07;29187] und die Schleife ist auch nicht des Rätsels lösung.[/QUOTE]Für das Warten? nein.

bye
TT

BWT
[spoiler]ist dieses “die angebotene Lösung nicht durchdenken und penetrant nachfragen” eigentlich schon eine weitere Phase?[/spoiler]

Habe den Code nicht gesehen, vermute aber, dass er als Vorlage für die GUI Version nicht geeignet ist.
Vielleicht hilft Dir ein anderer Ansatz:

  1. Vergiss die Schleife
  2. Baue Deine GUI
  3. Erzeuge eine Zufallszahl
  4. Zeige die GUI zur Eingabe an
  5. Lies die Eingabe aus, überprüfe sie und reagiere auf das Ergebnis der Überprüfung.

Das funktioniert ja soweit aber die Schleife wartet nicht bis ich die Eingabe getätigt habe.

Mit freundlichem Gruß,
MrSmile07