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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |