Swing Countdown mit Minuten und Sekunden

Simmy-Jimmy

Mitglied
Hallo,
ich habe folgenden Code:

Java:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.Timer;

public class Test extends JFrame{
	
	
	JLabel zeit, aZeit, z;
	int counter;
	JTextField tf;
	JButton start;
	
	Timer timer;
	
	public Test(){
		
		setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
		
		
		zeit = new JLabel("Zeit eingeben:");
		zeit.setFont(zeit.getFont().deriveFont(20f));
		add(zeit);
		
		tf = new JTextField(5);
		tf.setPreferredSize(new Dimension(30, 30));
		add(tf);
		
		JLabel min = new JLabel("Minuten");
		min.setFont(zeit.getFont().deriveFont(20f));
		add(min);
		
		
		start = new JButton("Countdown starten");
		add(start);
		
		aZeit = new JLabel("");
		aZeit.setFont(zeit.getFont().deriveFont(28f));
		add(aZeit);
		
		z = new JLabel("");
		z.setFont(zeit.getFont().deriveFont(150f));
		add(z);
		
		
		event e = new event();
		start.addActionListener(e);
		
		
	}
	
	public class event implements ActionListener{
		public void actionPerformed(ActionEvent e){
			
			int count = (int)(Double.parseDouble(tf.getText()));
			
			
			
			z.setText(""+count);
			aZeit.setText("       Verbleibende Zeit:       ");
			

			TimeClass tc = new TimeClass(count);
			timer = new Timer(60000, tc);
			timer.start();
			
			
		}
	}
	
	public class TimeClass implements ActionListener{
		int counter;
		
		public TimeClass(int counter){
		this.counter = counter;
		}
		
		public void actionPerformed (ActionEvent tc) {
			counter--;
			
			
			if (counter>=1){
				aZeit.setText("Verbleibende Zeit:"+counter);
				
			}else{
				timer.stop();
				aZeit.setText("Fertig");
				
				
			}
		}		
			
	}
	
	
	public static void main (String[] args){
		Test f = new Test();
		
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setSize(400, 400);
		f.setResizable(false);
		f.setLocationRelativeTo(null);
		f.setTitle("Countdown");
		f.setVisible(true);
	}
}

Nun will ich aber, dass wenn die Zeit unten runterzählt, da nicht nur Minuten sondern auch Sekunden angezeigt werden.

Wie mache ich das?

Gruß
 

Joose

Top Contributor
In dem du den Wert den du ins Textfeld eingibst nur auf Sekunden umrechnest.
Bei der Anzeige musst du aus diesen Sekunden wieder Minuten und Sekunden machen:

60 Sekunden = 1 Minute
 

Simmy-Jimmy

Mitglied
In dem du den Wert den du ins Textfeld eingibst nur auf Sekunden umrechnest.
Bei der Anzeige musst du aus diesen Sekunden wieder Minuten und Sekunden machen:

60 Sekunden = 1 Minute

Wie geht das konkret?

Ich änder dashier ab:
Java:
timer = new Timer(1000, tc);
(von 60000 auf 1000)

und wie lass ich dann unten Minuten und Sekunden anzeigen?
Weil theoretisch müsste ich ja dann den counter umändern oder nicht?
 

Joose

Top Contributor
Nein du übergibst dem Objekt deiner Klasse "TimeClass" im Konstruktor den Wert in Sekunden.
Und beim Setzen des Wertes auf das Textfeld ("Verbleibende Zeit: .....") rechnest du diesen Wert einfach um.

Java:
	public class TimeClass implements ActionListener{
		int counter;
		
		public TimeClass(int counter){
		this.counter = counter;
		}
		public void actionPerformed (ActionEvent tc) {
			counter--;
			if (counter>=1){
				int minuten = ??; // aus counter die minuten ausrechnen
				int sekunden = ??; // die restlichen sekunden ausrechnen
				aZeit.setText("Verbleibende Zeit:" + minuten + ":" + sekunden);
			}else{
				timer.stop();
				aZeit.setText("Fertig");
			}
		}			
	}
 
Zuletzt bearbeitet:

Viper13125

Mitglied
Hallo zusammen,
vielleicht kann mir ja hier jemand Helfen. Ich habe theoretisch das selbe Problem. Die Lösung von oben geht bei mir leider nicht oder ich trage irgendwo was falsch ein.

Hier der Code wie er funktioniert aber nur Sekunden ausgibt

Java:
    Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            
            int counter = 1200;           
            @Override
            public void run() {
                if(counter>0) {
                    counter--;
                    TimeLabel1.setText("" + counter);
            }
                
                else {
                    getContentPane().setBackground(Color.RED);
                    verticalBox.setBackground(Color.YELLOW);                   
                    timer.cancel();
                }
            }
        };
        Calendar date = Calendar.getInstance();
        date.set(Calendar.HOUR_OF_DAY,8);
        date.set(Calendar.MINUTE,40);
        date.set(Calendar.SECOND,00);
        date.set(Calendar.MILLISECOND,00);
    
        timer.scheduleAtFixedRate(task, date.getTime(), 1000);

und ich hätte gern das er das in Minuten und Sekunden ausgibt und wenn beides auf null ist dann die else ausführt

Ich bedank mich schon mal für eure Mühen
 

Neumi5694

Top Contributor
Sekunden = counter %60;
Minuten = (counter) / 60 % 60;

Edit: unnötig kompliziert, DIV streicht bereits die Sekunden raus. ausgebessert
 

Viper13125

Mitglied
Hallo zusammen,
ich Probiere jetzt schon eine weile rum meinen Counter so hin zu bekommen das, wenn einstellige Zahlen kommen auch eine 0 davor steht aber ich Scheiter leider daran.

Vielleicht hat ja einer eine einfache Lösung zur Hand


Java:
    Timer timer2_1 = new Timer();
    TimerTask task2_1 = new TimerTask() {
        
        int counter = 1200;   
        @Override
        public void run() {
            if(counter>0) {
                counter--;
                counterLabel.setText((counter) / 60 / 60 % 60 + ":" + (counter) / 60 % 60 + ":" + counter %60);
        }   
            else {
                naestegruppeLabel.setBackground(new Color(0, 128, 0));
                timer2_1.cancel();
            }
        }
    };
    Calendar date2_1 = Calendar.getInstance();
    date2_1.set(Calendar.HOUR_OF_DAY,9);
    date2_1.set(Calendar.MINUTE,0);
    date2_1.set(Calendar.SECOND,00);
    date2_1.set(Calendar.MILLISECOND,00);

    timer2_1.scheduleAtFixedRate(task2_1, date2_1.getTime(), 1000);

Danke für die Hilfe bin leider nicht vom Fach.
 

KonradN

Super-Moderator
Mitarbeiter
Um einen Integer zu formatieren kannst Du z.B. String.format verwenden. String.format("%02d", (counter) / 60 % 60) würde z.B. so einen zweistelligen Integer erzeugen. String zu erzeigen, der einen Integer mit 2 Stellen erzeugt.

Edit: Formulierung verbessert - es wird ja ein String erzeugt und kein Integer.
 

Ähnliche Java Themen

Neue Themen


Oben