加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

javafx-8 – 在响应属性更改JavaFX 8之前等待

发布时间:2020-12-15 04:18:27 所属栏目:Java 来源:网络整理
导读:有没有办法继续听一个属性更改,几秒钟,然后激活一个事件(调用方法)? 例如,当用户在文本字段中输入数据时: textField.textProperty().addListener(new ChangeListenerString() { @Override public void changed(ObservableValue? extends String arg0,Strin
有没有办法继续听一个属性更改,几秒钟,然后激活一个事件(调用方法)?

例如,当用户在文本字段中输入数据时:

textField.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> arg0,String arg1,String arg2) {
        //before calling a method to do something.. wait for a few seconds ...
        }
    });

场景将基于字符串值触发操作.例如,按“M”表示移动,或“MA”表示屏蔽.在做出动作之前,我想“继续听”2秒钟.

解决方法

有几种方法可以解决这个问题.

通常我会推荐Java Timer API,但是如果通过“制作动作”你暗示更新FX线程上的东西,你将不得不同步线程,这是麻烦的.

根据您的使用情况,您可以使用转换或FX中的时间轴.

以下是转换的示例:

包装申请;

import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TransitionedInputExample extends Application {
  @Override
  public void start(final Stage stage) {
    final ImageView spinner =
        new ImageView("https://cdn1.iconfinder.com/data/icons/duesseldorf/16/process.png");
    spinner.setVisible(false);

    final Label title = new Label("Timed Action Commander Example",spinner);
    title.setContentDisplay(ContentDisplay.BOTTOM);
    title.setFont(Font.font("Helvetica",FontWeight.BOLD,FontPosture.REGULAR,16));

    final TextField textInput = new TextField();
    textInput.setPromptText("Enter command");

    final TextArea textOutput = new TextArea();
    textOutput.setPromptText("Command results will show up here");

    final VBox layout = new VBox(title,textInput,textOutput);
    layout.setSpacing(24);

    // setup some transition that rotates an icon for 2 seconds
    final RotateTransition rotateTransition = new RotateTransition(Duration.seconds(1),spinner);
    rotateTransition.setByAngle(90);
    // delay rotation so that user can type without being distracted at once
    rotateTransition.setDelay(Duration.seconds(1));

    // restart transition on user input
    textInput.textProperty().addListener((observable,oldText,newText) -> {
      spinner.setVisible(true);
      rotateTransition.playFromStart();
    });

    rotateTransition.setOnFinished((finishHim) -> {
      // execute command
        textOutput.setText("Executing " + textInput.getText());
        spinner.setVisible(false);
      });


    final Scene scene = new Scene(layout);
    stage.setScene(scene);
    stage.show();
  }

  public static void main(final String[] args) {
    launch(args);
  }
}

有关使用时间轴的解决方案,请参阅this post.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读