while loop, Button action

Devil0s

Aktives Mitglied
Ich fange jetzt grade an Java zu lernen, beschaeftige mich jetzt grade mit GUI usw..
und ich bin auf folgendes Problem gestossen.

Ich wollte eine Stoppuhr programmieren.
Ich hab mit Netbeans(mit dem GUI-Builder) eine GUI erstellt mit Buttons, einem Textfeld usw...
Jetzt wollte ich auf Knopfdruck den Text im Textfeld aendern.
Das wenn ich den Stopbutton druecke das Textfeld sich zu der gestoppten Zeit aendert.
Nun wollte ich gerne das das Label sich Zeitgleich (der zumindest alle 100 Milisekunden aendern naemlich zur gerade laufender Zeit).
Ich denke, dass es einen loop geben muesste, da sich das Textfeld ja immer "erneuern" soll.
Ich habe das einmal mit einem while loop probiert und dann nochmal mit einem do...while loop.
Die Variable Zahl habe ich als 2 definiert und die Zeiten sind alle vom Typ double.
So sieht das jetzt im Moment aus:


Java:
private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
        
        zeit1 = System.currentTimeMillis();
        
        do {
     
        zeit2 = System.currentTimeMillis();        
        zeit3 = zeit2 - zeit1;
        zeitEnde = zeit3 / 1000;
        textfeld.setText(" " + zeitEnde);
        
            
        } while (zahl1 != 1);
      
        
        textfeld.setText(" " + zeitEnde);
          
    }                                           

    private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        


       int zahl1 = 1;

                   textfeld.setText(" " + zeitEnde);

Mein Problem dabei ist jetzt, dass wenn ich den Startbutton druecke (auf der GUI) er gedrueckt bleibt als ob das Programm sich aufgehaengt hat.
Ich kann den Stopbutton leider auch nicht druecken.
Es liegt nicht am Button.
Der hat davor ja FUNKTIONIERT als das ganze so war:

Java:
private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
        
        zeit1 = System.currentTimeMillis();
        

          
    }                                           

    private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        
       
       zeit2 = System.currentTimeMillis();
       zeit3 = zeit2 - zeit1;
       zeitEnde = zeit3 / 1000;
       textfeld.setText(" " + zeitEnde);

Koennte es vielleicht daran liegen, das man loops nicht der actionEvents von GUI nehmen darf/kann oder

Ich hoffe ihr koennt mir helfen
Vielen danke.
Devil0s

PS: Ich habe das komplette Programm im Anhang wenn ihr noch mehr Infos wollt/braucht. 😉
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
[ot]s***** gui-builder!!!![/ot]

deine "Stoppuhr" läuft wahrscheinlich auf dem EDT, also wird solange die GUI blockiert.
Lass deine Stoppuhr in einem eigenen Thread laufen(extends Thread, oder implements Runnable) und schon wird das prob erledigt sein 😉
 
Ich versteh Threads irgentwie nicht. 🙁
Koennte vielleicht mir einer das mal anhand des Code(den ich weiter oben gepostet habe) demonstrieren??
Waer echt nett. 😉
 
ganz einfach

die GUI läuft im EDT ...
der is dafür zuständig die eingaben vom user entgegenzunehmen und die GUI zu verändern ...

alles andere sollte nach möglichkeit in einem unabhängigen thread davon laufen ...

das nennt "parallelisierung" ...

stells dir so vor

die GUI läuft auf einem cpu kern ... und alles andere auf nem anderen ... so freezed die GUI nich

wenn du threads nich verstehst zieh dir das kapitel "Threads" aus der javainsel dazu rein
 
Hier ne kleines Beispiel. Sollte eigentlich selbsterklärend sein, falls Fragen sind stell se einfach:

Java:
public static void main(String[] args) {
	JFrame frame = new JFrame("Threads");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	final JLabel counterLabel = new JLabel("0");
	JButton button = new JButton("Count!");
	button.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					for (int i = 0; i < 10; i++) {
						counterLabel.setText(String.valueOf(i));
						doSleep(1000);
					}
				}
				
				private void doSleep(int i) {
					try {
						Thread.sleep(i);
					} catch (InterruptedException ie) { }
				}
			}).start();
		}
	});
	
	frame.add(counterLabel, BorderLayout.NORTH);
	frame.add(button, BorderLayout.SOUTH);
	frame.pack();
	frame.setVisible(true);
}
 
Ich hab dir nen link geschickt, da habe ich ein Videotutorial zu genau deinem Thema.

Stopuhr programmieren mit Parrallelisierung!

Also zur not musste den Code nur nachschreiben und hättest es schon im Sack.:joke:
 

Zurück
Oben