Guten Abend,
zu Anfang würde ich gerne sagen, dass ich ein totaler Noob in jeglichen Programmiersprachen bin, die es so gibt. Ich habe mich in den letzten Tagen mehr und mehr mit Java auseinander gesetzt, und eine gewisse "Zuneigung" zu Java entwickelt. Allerdings habe ich mir kaum irgendwelche Tutorials angeschaut, die 60 Videos beinhalten. Lediglich die Grundlagen, die so ziemlich jede Programmiersprache mit sich bringt, und meist auch anwendet (Loops, Data Types, Variables etc).
In den letzten 2 Tagen habe ich dann angefangen, einen kleinen Countdown Timer zu erstellen. Wohlgemerkt ohne javax.swing.Timer zu benutzen. Ich wusste bis heute nicht einmal, dass es diese Funktion gibt. Aber nun gut, angefangen mit einer Variable für die Minuten, einer für die Sekunden, und einer für die Minuten*60+Sekunden. Eine for Loop, die das ganze dann auf der Konsole runter zählt. So weit so gut.
Nun bin ich bei der 2ten Version angekommen. Diese soll etwas hübscher werden und sogar ein Fenster mit einem Countdown, jener jede Sekunde runter zählt beinhalten. Nach einigem rumprobieren und 4 verschiedene Loop-Lösungsansätzen später bin ich bei diesem Code angekommen:

Bitte bedenkt, dass ich ein kompletter Noob bin, und das obige vielleicht nicht die beste Lösung ist. Nun zu meinem Problem.
Ich habe eine Funktion, welche updateHUD(); heißt. Diese soll den Text von lblOutputtimemin und lblOutputtimesec mit Hilfe von .setText(Integer.toString(Variable)) neu setzen. Dies soll jede Sekunde geschehen, deshalb wird sie mit in der while loop aufgerufen. Das "HUD" wird allerdings nur am Anfang, wenn der Input kommt und am Ende der while loop geupdated.
Meine Frage:
Warum? Die Funktion sleep(); wird auf die selbe Weise aufgerufen und auch ausgeführt, warum funktioniert das nicht mit der updateHUD(); Funktion?
Meine Theorie:
Die Funktion updateHUD(); updated jede Sekunde, allerdings noch mit den alten Werten, bis die Loop zu Ende ist. Allerdings ändern sich die Werte eigentlich jede Sekunde, da die Kontrolle der Werte (Ausgabe der Loop auf der Konsole) ja auch funktioniert. Falls dies trotzdem der Fall ist, wie kann ich das ganze nun anpassen, sodass alles funktioniert?
Ich möchte nicht mit einem Timer arbeiten, sondern meine Weise benutzen, da ich diese zu 100% nachvollziehen kann, und dem Problem nicht einfach aus dem Weg gehe, indem ich eine andere Art benutze. Wie gesagt, ich möchte verstehen was ich mache, somit ist der Lerneffekt am höchsten.
Bis jetzt funktioniert alles, bis auf die updateHUD(); Funktion.
Zusatz:
Ich habe eine Kontrolle mit eingebaut, ob der input Wert zwischen 0 und 60 liegt, falls dies nicht der Fall ist, soll der User den Input nochmal neu eingeben. Der User kann allerdings noch einen String eingeben, und somit eine Fehlermeldung hervorrufen, wie kann ich einen entsprechenden Check mit einbauen?
Gruß
Marcel
zu Anfang würde ich gerne sagen, dass ich ein totaler Noob in jeglichen Programmiersprachen bin, die es so gibt. Ich habe mich in den letzten Tagen mehr und mehr mit Java auseinander gesetzt, und eine gewisse "Zuneigung" zu Java entwickelt. Allerdings habe ich mir kaum irgendwelche Tutorials angeschaut, die 60 Videos beinhalten. Lediglich die Grundlagen, die so ziemlich jede Programmiersprache mit sich bringt, und meist auch anwendet (Loops, Data Types, Variables etc).
In den letzten 2 Tagen habe ich dann angefangen, einen kleinen Countdown Timer zu erstellen. Wohlgemerkt ohne javax.swing.Timer zu benutzen. Ich wusste bis heute nicht einmal, dass es diese Funktion gibt. Aber nun gut, angefangen mit einer Variable für die Minuten, einer für die Sekunden, und einer für die Minuten*60+Sekunden. Eine for Loop, die das ganze dann auf der Konsole runter zählt. So weit so gut.
Nun bin ich bei der 2ten Version angekommen. Diese soll etwas hübscher werden und sogar ein Fenster mit einem Countdown, jener jede Sekunde runter zählt beinhalten. Nach einigem rumprobieren und 4 verschiedene Loop-Lösungsansätzen später bin ich bei diesem Code angekommen:

Java:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class CountDownTimer {
private JFrame frmCountdownTimerBy;
private static JLabel lblOutputtimesec;
private static JLabel lblOutputtimemin;
static int inputTimeMin;
static int inputTimeSec;
static int outputTimeMin;
static int outputTimeSec;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CountDownTimer window = new CountDownTimer();
window.frmCountdownTimerBy.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void inputTime(){
String timeMin = JOptionPane.showInputDialog("Bitte geben Sie die Minuten ein.");
Integer timeMins = Integer.parseInt(timeMin);
inputTimeMin = timeMins;
outputTimeMin = inputTimeMin;
if((inputTimeMin >= 0 && inputTimeMin <= 60)){
lblOutputtimemin.setText(Integer.toString(inputTimeMin));
}else{
JOptionPane.showMessageDialog(null, "Bitte geben Sie eine Zahl zwischen 0 und 60 ein!");
inputTime();
}
String timeSec = JOptionPane.showInputDialog("Bitte geben Sie die Sekunden ein.");
Integer timeSecs = Integer.parseInt(timeSec);
inputTimeSec = timeSecs;
outputTimeSec = inputTimeSec;
if(inputTimeSec >= 0 && inputTimeSec <= 60){
lblOutputtimesec.setText(Integer.toString(inputTimeSec));
}else{
JOptionPane.showMessageDialog(null, "Bitte geben Sie eine Zahl zwischen 0 und 60 ein!");
inputTime();
}
}
public static boolean timeLeft(){
while((outputTimeMin == 0 && outputTimeSec >= -1) || outputTimeMin > 0){
return true;
}return false;
}
public static void sleep(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void updateHUD(){
lblOutputtimesec.setText(Integer.toString(outputTimeSec));
lblOutputtimemin.setText(Integer.toString(outputTimeMin));
}
public static void startCountdown(){
while(timeLeft()){
sleep();
updateHUD();
//Kontrolle ob die Loop läuft
System.out.println(outputTimeMin + ":" + outputTimeSec);
if(outputTimeSec > 0){
outputTimeSec--;
}else if(outputTimeMin > 0){
outputTimeMin--;
outputTimeSec = outputTimeSec + 59;
}else{
JOptionPane.showMessageDialog(null, "Die Zeit ist abgelaufen.");
break;
}
}
}
/**
* Create the application.
*/
public CountDownTimer() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmCountdownTimerBy = new JFrame();
frmCountdownTimerBy.setTitle("Countdown Timer");
frmCountdownTimerBy.setResizable(false);
frmCountdownTimerBy.setBounds(100, 100, 1000, 600);
frmCountdownTimerBy.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmCountdownTimerBy.getContentPane().setLayout(null);
JLabel lblCountdownTimerErstellt = new JLabel("\u00A9 2015 - Countdown Timer erstellt von Marcel Kirchhoff");
lblCountdownTimerErstellt.setBounds(665, 534, 319, 37);
frmCountdownTimerBy.getContentPane().add(lblCountdownTimerErstellt);
JSeparator separator_1 = new JSeparator();
separator_1.setBackground(Color.WHITE);
separator_1.setForeground(Color.LIGHT_GRAY);
separator_1.setBounds(0, 40, 1004, 2);
frmCountdownTimerBy.getContentPane().add(separator_1);
JLabel lblCountdownTimer = new JLabel("Countdown Timer");
lblCountdownTimer.setFont(new Font("Gotham Light", Font.ITALIC, 30));
lblCountdownTimer.setHorizontalAlignment(SwingConstants.CENTER);
lblCountdownTimer.setBounds(10, 0, 974, 42);
frmCountdownTimerBy.getContentPane().add(lblCountdownTimer);
JSeparator separator = new JSeparator();
separator.setBounds(983, 442, -287, 86);
frmCountdownTimerBy.getContentPane().add(separator);
JSeparator separator_2 = new JSeparator();
separator_2.setBackground(Color.WHITE);
separator_2.setForeground(Color.LIGHT_GRAY);
separator_2.setBounds(0, 534, 994, 2);
frmCountdownTimerBy.getContentPane().add(separator_2);
JButton btnNewButton = new JButton("Zeit setzen");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
inputTime();
}
});
btnNewButton.setBackground(Color.LIGHT_GRAY);
btnNewButton.setBounds(286, 473, 200, 50);
frmCountdownTimerBy.getContentPane().add(btnNewButton);
JButton btnNewButton_1 = new JButton("Countdown starten");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startCountdown();
}
});
btnNewButton_1.setBackground(Color.LIGHT_GRAY);
btnNewButton_1.setBounds(496, 473, 200, 50);
frmCountdownTimerBy.getContentPane().add(btnNewButton_1);
JLabel lblMinuten = new JLabel("Minuten");
lblMinuten.setFont(new Font("Gotham Light", Font.PLAIN, 30));
lblMinuten.setHorizontalAlignment(SwingConstants.CENTER);
lblMinuten.setBounds(286, 80, 200, 26);
frmCountdownTimerBy.getContentPane().add(lblMinuten);
JLabel lblSekunden = new JLabel("Sekunden");
lblSekunden.setFont(new Font("Gotham Light", Font.PLAIN, 30));
lblSekunden.setHorizontalAlignment(SwingConstants.CENTER);
lblSekunden.setBounds(496, 80, 200, 26);
frmCountdownTimerBy.getContentPane().add(lblSekunden);
lblOutputtimemin = new JLabel("0");
lblOutputtimemin.setFont(new Font("Gotham Light", Font.PLAIN, 100));
lblOutputtimemin.setHorizontalAlignment(SwingConstants.CENTER);
lblOutputtimemin.setBounds(286, 117, 200, 345);
frmCountdownTimerBy.getContentPane().add(lblOutputtimemin);
lblOutputtimesec = new JLabel("0");
lblOutputtimesec.setFont(new Font("Gotham Light", Font.PLAIN, 100));
lblOutputtimesec.setHorizontalAlignment(SwingConstants.CENTER);
lblOutputtimesec.setBounds(496, 117, 200, 345);
frmCountdownTimerBy.getContentPane().add(lblOutputtimesec);
}
}
Bitte bedenkt, dass ich ein kompletter Noob bin, und das obige vielleicht nicht die beste Lösung ist. Nun zu meinem Problem.
Ich habe eine Funktion, welche updateHUD(); heißt. Diese soll den Text von lblOutputtimemin und lblOutputtimesec mit Hilfe von .setText(Integer.toString(Variable)) neu setzen. Dies soll jede Sekunde geschehen, deshalb wird sie mit in der while loop aufgerufen. Das "HUD" wird allerdings nur am Anfang, wenn der Input kommt und am Ende der while loop geupdated.
Meine Frage:
Warum? Die Funktion sleep(); wird auf die selbe Weise aufgerufen und auch ausgeführt, warum funktioniert das nicht mit der updateHUD(); Funktion?
Meine Theorie:
Die Funktion updateHUD(); updated jede Sekunde, allerdings noch mit den alten Werten, bis die Loop zu Ende ist. Allerdings ändern sich die Werte eigentlich jede Sekunde, da die Kontrolle der Werte (Ausgabe der Loop auf der Konsole) ja auch funktioniert. Falls dies trotzdem der Fall ist, wie kann ich das ganze nun anpassen, sodass alles funktioniert?
Ich möchte nicht mit einem Timer arbeiten, sondern meine Weise benutzen, da ich diese zu 100% nachvollziehen kann, und dem Problem nicht einfach aus dem Weg gehe, indem ich eine andere Art benutze. Wie gesagt, ich möchte verstehen was ich mache, somit ist der Lerneffekt am höchsten.
Bis jetzt funktioniert alles, bis auf die updateHUD(); Funktion.
Zusatz:
Ich habe eine Kontrolle mit eingebaut, ob der input Wert zwischen 0 und 60 liegt, falls dies nicht der Fall ist, soll der User den Input nochmal neu eingeben. Der User kann allerdings noch einen String eingeben, und somit eine Fehlermeldung hervorrufen, wie kann ich einen entsprechenden Check mit einbauen?
Gruß
Marcel
Zuletzt bearbeitet: