Diskuze: 5 minutový countdown (v JavaFX)
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Petr Štechmüller:21.5.2016 12:25
Ahoj, co na to jít trochu jinak. Pokud chceš odpočet 5 minut, tak ten interval čas sekundy nastav na hodnotu 5*60. Pak místo kontroly, zda-li i==0 můžeš kontrolovat něco ve stylu i%60==0. Tímto zkontrolujes, jestli je hodnota i násobek 60, neboli jestli ubehla minuta. Pokud se podmínka splní, tak můžeš odečíst minutu a nemusí s restartovat žádném timer...
+20 Zkušeností
+2,50 Kč
Erik Šťastný:21.5.2016 13:16
Ahoj ahoj, nechci ti tu myšlenku nějakou celou rozbíjet, ale nešlo by vyjít z aktuálního systémového času a založit to na tom?
Vojtěch Bešťák:21.5.2016 15:53
Děkuji dobrý nápad, zkusil jsem to nějak předělat:
@FXML
private void handlestartButtonAction(ActionEvent event)
{
cas();
startButton.setVisible(false);
}
private int zbyvaMinut = 5;
private int zbyvaSekund = zbyvaMinut*60;
private int zbyvaMinutAktualne = zbyvaMinut;
private int zbyvaSekundAktualne = zbyvaSekund;
private final StringProperty casSekundyValue = new SimpleStringProperty(zbyvaSekund + "");
private final StringProperty casMinutyValue = new SimpleStringProperty(zbyvaMinut + "");
private final Timeline casSekundy = new Timeline(new KeyFrame(Duration.seconds(1), (e) -> {
zbyvaSekundAktualne--;
int vytisk = (zbyvaSekundAktualne - ((zbyvaMinutAktualne - 1) * 60)) -1;
casSekundyValue.setValue(String.format("%02d", vytisk));
if(zbyvaSekundAktualne == zbyvaSekund - 1)
{
odeberMinuty();
}
if(zbyvaSekundAktualne == 241 || zbyvaSekundAktualne == 181 || zbyvaSekundAktualne == 121 || zbyvaSekundAktualne == 61)
{
odeberMinuty();
zbyvaMinutAktualne--;
}
}));
public void cas()
{
casSekundy.setCycleCount(zbyvaSekund); //nastaví se počet opakování, tedy počet sekund k odpočtu
casSekundy.play();
}
public void odeberMinuty()
{
int j = Integer.parseInt(casMinutyValue.getValue()) - 1;
casMinutyValue.setValue(String.format("%02d", j));
zbyvaMinut--;
}
@Override
public void initialize(URL url, ResourceBundle rb) {
countdownLabel.textProperty().bind(countDownValue);
casSekundyLabel.textProperty().bind(casSekundyValue);
casMinutyLabel.textProperty().bind(casMinutyValue);
countdownLabel.setVisible(false);
Po tomto to již ve své podstatě odpočítává 5 minut, ale na úplném začátku před zmáčknutí tlačítka se zobrazuje: viz. obrazek - 5 minut 300 sekund (tedy počáteční hodnoty countdownu)
Po zmáčknutí tlačítka se 1 sekudnu nic neděje, a pak se najednou objeví 04:58. To znamená, že z nějakého důvodu nezobrazí 59.
Další věc, která je tak trochu rozbitá je přechod jednotlivých minut. casMinutyLabel se v GUI zmenší o 1 ve chvíly, kdy v casSekundyLabel je teprve 00.
Nezná prosím někdo řešení těchto problémů?
Atrament:21.5.2016 17:00
Já bych na to šel ještě trochu jinak Změnil bych nastavení té timeline tak aby neodpočítávala konkrétní počet cyklů, ale aby běžela do nekonečna setCycleCount(Timeline.INDEFINITE). Tím by mi vlastně odtikávala sekundy. Při každém 'tiknutí' bych zkontroloval jestli jsou minuty a sekundy už nula, a když jo tak bych tu timeline stopnul a provedl to co chceš provést po skončení odpočtu. Když ne tak bych ubral jednu sekundu, pokud by se tím dostal počet sekund na nulu tak bych koukl jestli jsou minuty víc než 0 a když jo tak bych ubral minutu a nastavil na sekundách 59.
Petr Štechmüller:21.5.2016 17:10
Tak to je podobné, co jsem já navrhoval s tím rozdílem, že znám předem dobu, jak dlouho to poběží...
Z nějakého důvodu mi tento kód hází po zmáčnkutí tlačítka
chybu:
Kód:
@FXML
private void handlestartButtonAction(ActionEvent event)
{
countdownLabel.setVisible(true);
cas();
startButton.setVisible(false);
}
private final StringProperty casSekundyValue = new SimpleStringProperty();
private final StringProperty casMinutyValue = new SimpleStringProperty();
private final Timeline casSekundy = new Timeline(new KeyFrame(Duration.seconds(1), (e) -> {
int s = Integer.parseInt(casSekundyValue.getValue());
int m = Integer.parseInt(casMinutyValue.getValue());
if(s == 0 && m == 0)
{
stopTimeLine();
System.out.println("Odpočet úspěšně dokončen");
}
else
if (s != 0)
{
casSekundyValue.setValue(String.format("%02d", s - 1));
}
else
{
casMinutyValue.setValue(String.format("%02d", m - 1));
casSekundyValue.setValue(String.format("%02d", 59));
}
}));
public void stopTimeLine()
{
casSekundy.stop();
}
public void cas()
{
casSekundy.setCycleCount(Timeline.INDEFINITE);
casSekundy.play();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
countdownLabel.textProperty().bind(countDownValue);
casSekundyLabel.textProperty().bind(casSekundyValue);
casMinutyLabel.textProperty().bind(casMinutyValue);
countdownLabel.setVisible(false);
}
Chyba:
ant -f "C:\\Users\\Vojta\\Dropbox\\Java\\Programy - NetBeans\\Objektově orientované programování\\STIGA-Scoreboard" jfxsa-run
init:
Deleting: C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\build\built-jar.properties
Compiling 1 source file to C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\build\classes
compile:
Detected JavaFX Ant API version 1.3
Launching <fx:jar> task from C:\Program Files\Java\jdk1.8.0_77\jre\..\lib\ant-javafx.jar
Warning: From JDK7u25 the Codebase manifest attribute should be used to restrict JAR repurposing.
Please set manifest.custom.codebase property to override the current default non-secure value '*'.
Launching <fx:deploy> task from C:\Program Files\Java\jdk1.8.0_77\jre\..\lib\ant-javafx.jar
No base JDK. Package will use system JRE.
No base JDK. Package will use system JRE.
jfx-deployment-script:
jfx-deployment:
jar:
Copying 12 files to C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\dist\run549448994
jfx-project-run:
Executing C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\dist\run549448994\STIGA-Scoreboard.jar using platform C:\Program Files\Java\jdk1.8.0_77\jre/bin/java
Exception in thread "JavaFX Application Thread" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.parseInt(Integer.java:615)
at stiga.scoreboard.FXMLDocumentController.lambda$new$1(FXMLDocumentController.java:135)
at com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
at com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
at javafx.animation.Timeline.impl_playTo(Timeline.java:176)
at javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
at com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(InfiniteClipEnvelope.java:110)
at javafx.animation.Animation.impl_timePulse(Animation.java:1102)
at javafx.animation.Animation$1.lambda$timePulse$25(Animation.java:186)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.animation.Animation$1.timePulse(Animation.java:185)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:506)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "JavaFX Application Thread" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.parseInt(Integer.java:615)
at stiga.scoreboard.FXMLDocumentController.lambda$new$1(FXMLDocumentController.java:135)
at com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
at com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
at javafx.animation.Timeline.impl_playTo(Timeline.java:176)
at javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
at com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(InfiniteClipEnvelope.java:110)
at javafx.animation.Animation.impl_timePulse(Animation.java:1102)
at javafx.animation.Animation$1.lambda$timePulse$25(Animation.java:186)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.animation.Animation$1.timePulse(Animation.java:185)
at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:506)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Deleting directory C:\Users\Vojta\Dropbox\Java\Programy - NetBeans\Objektově orientované programování\STIGA-Scoreboard\dist\run549448994
jfxsa-run:
BUILD SUCCESSFUL (total time: 11 seconds)
Děkuji moc Už jsem na to přišel, stačilo definovat tyto dvě proměnné:
private final StringProperty casSekundyValue = new SimpleStringProperty(0 + "");
private final StringProperty casMinutyValue = new SimpleStringProperty(5 + "");
Nicméně mám ještě jeden dotaz, jde nějak udělat, aby countdown před
zmáčknutím tlačítka vypadal jako po zmáčknutí?
viz obrázky
Zobrazeno 8 zpráv z 8.