当前位置: 首页 > 知识库问答 >
问题:

javafx应用程序中的计时器

狄兴邦
2023-03-14

我试图显示一个计时器,它在点击开始按钮后计数并在标签中显示秒数,但我没有得到想要的输出。这是我的控制器代码和FXML文件。。。

public class FXMLDocumentController implements Initializable {

    @FXML
    private static final Integer STARTTIME = 0;
    private Timeline timeline;
    private Label timerLabel = new Label();
    private IntegerProperty timeSeconds = new SimpleIntegerProperty(STARTTIME);
    Button button = new Button();


    public void handle(ActionEvent event) {
        if (timeline != null) {
            timeline.stop();
        }
        timeSeconds.set(STARTTIME);
        timeline = new Timeline();

        timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(STARTTIME+1),
                                    new KeyValue(timeSeconds, 0)));
        timeline.playFromStart();
        timerLabel.textProperty().bind(timeSeconds.asString());

    }



     public void initialize(URL url, ResourceBundle rb) {
         // TODO

     }    

}

这是我的FXML代码...

xml prettyprint-override"><Button fx:id="button" layoutX="120.0" layoutY="40.0" 
        mnemonicParsing="false" text="Start Timmer" onAction="#handle" />
<Label layoutX="132.0" layoutY="92.0" prefHeight="17.0" prefWidth="65.0" 
       textFill="#f20b0b">
    <font>
        <Font size="24.0" />
    </font>
</Label>

共有1个答案

赵禄
2023-03-14

您没有正确使用Timeline

关键帧的持续时间是执行更新时从动画开始的偏移量。多次单击按钮都会添加动画开始后1秒运行的关键帧。

此外,使用KeyValue将当前值插值为传递给KeyValue的值。如果新值与旧值相同,这就没有什么意义。

相反,您应该使用EventHandler

此外,按钮字段应该由FXMLLoader注入。这要求该字段为公共或用@FXML注释。

<Button fx:id="button" layoutX="120.0" layoutY="40.0" 
        mnemonicParsing="false" text="Start Timmer" onAction="#handle" />
<Label fx:id="timerLabel" layoutX="132.0" layoutY="92.0" prefHeight="17.0" prefWidth="65.0" 
       textFill="#f20b0b">
    <font>
        <Font size="24.0" />
    </font>
</Label>
public class FXMLDocumentController implements Initializable {

    private static final int STARTTIME = 0;
    private Timeline timeline;
    private final IntegerProperty timeSeconds = new SimpleIntegerProperty(STARTTIME);

    @FXML
    private Label timerLabel;
    @FXML
    private Button button;

    private void updateTime() {
        // increment seconds
        int seconds = timeSeconds.get();
        timeSeconds.set(seconds+1);
    }

    public void handle(ActionEvent event) {
        button.setDisable(true); // prevent starting multiple times
        timeline = new Timeline(new KeyFrame(Duration.seconds(1), evt -> updateTime())); 
        timeline.setCycleCount(Animation.INDEFINITE); // repeat over and over again
        timeSeconds.set(STARTTIME);
        timeline.play();
    }

    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        timerLabel.textProperty().bind(timeSeconds.asString());
    }    

}

 类似资料:
  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:

  • 问题内容: 我试图混淆我的JavaFX应用程序,但失败了。生成的结果不起作用,我不明白为什么。最终的jar失败了,因为fxml文件无法再加载所有导入(ClassNotFoundException)。 部署工作流程: 生成可运行的jar(在IntelliJ知识中作为工件) 用ProGuard混淆那个罐子 修复ProGuard无法执行的那个jar中的一些问题 1)最小示例应用 示例应用程序“ Guar

  • 我试图混淆我的JavaFX应用程序,但它失败了。生成的结果不工作,我不明白为什么。由于fxml文件无法加载所有导入(ClassNotFoundException),因此生成的jar会失败。 null null 现在结构看起来是这样的: sample.fxml文件现在如下所示: 现在这个罐子应该真的又能工作了,因为一切又正常了。但事实并非如此!fxml加载程序无法加载CustomControl(现在

  • 我是的新手,我正在尝试使用在eclipse上构建一个应用程序,我遵循了一个教程,并且做了完全相同的操作,该应用程序非常简单,当我试图编译它时,我得到了一堆我甚至不理解的错误: 你能告诉我我错过了什么吗。

  • 我正在尝试创建一个JavaFX程序,该程序从用户那里获取第一个数字和第二个数字,并根据用户选择的按钮进行加法,乘法,减法或除法,并在文本字段中显示结果。我已经创建了这些方法并正确设置了我的类,但我不确定为什么当我单击按钮时我的事件不起作用。任何类型的指导将不胜感激。我也在使用Eclipse。谢谢 主要.java Controller.java fxml.java

  • 问题内容: 由于fxml- files使用Controller类来处理事件,因此如何混淆JavaFX应用程序?当混淆的conntroller类具有不同的名称和路径时,fxml文件将找不到它们。 混淆后编辑fxml文件不是我想要的解决方案。 还有其他选择吗? 问题答案: 没有意义重塑轮子; 快速的google搜索产生了这个网站。 它使用Proguard混淆器。