基本上我试图在GUI上创建一个按钮,该按钮在按下时每0.5秒运行一些语句。目前我已经创建了名为" Next Generation"。
的实际按钮Button nextGenButton = new Button("Next Generation");
在此之后我该怎么办?我假设我必须使用某种类型的事件处理程序?
答案 0 :(得分:2)
结帐setOnMousePressed和setOnMouseReleased。
您的代码看起来有点像这样:
final Button btn = new Button("Click me!");
btn.setOnMousePressed((event) -> {
/**
* Check if this is the first time this handler runs.
* - If so, start a timer that runs every 0.5 seconds.
* - If not, do nothing. The timer is already running.
*/
});
btn.setOnMouseReleased((event) -> {
//Stop the timer.
});
请注意,按下按钮时会重复调用onMousePressed
,因此您必须先检查它是否是第一次。
答案 1 :(得分:2)
您可以使用按钮的武装属性。不要使用鼠标或按键事件,否则您必须检查所有这些事件。检查动作事件不会对你有所帮助,因为它会被触发一次e。 G。鼠标被释放。随着武装财产你也覆盖e。 G。当按钮具有焦点时,当用户按下键盘上的空格键时,按钮被激活。
在按钮关闭时使用带有计数器的文本字段的示例:
public class ButtonDemo extends Application {
// counter which increases during button armed state
int counter = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// create textfield with the counter value as text
TextField textField = new TextField();
textField.setAlignment( Pos.CENTER_RIGHT);
textField.setText( String.valueOf(counter));
// timeline that gets started and stopped depending on the armed state of the button. event is fired every 500ms
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(500), actionEvent -> { counter++; textField.setText( String.valueOf(counter)); }));
timeline.setCycleCount(Animation.INDEFINITE);
// button which starts/stops the timeline depending on the armed state
Button button = new Button( "ClickMe");
button.armedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
System.out.println( "armed: " + newValue);
if( newValue) {
timeline.play();
} else {
timeline.stop();
}
}
});
// container for nodes
HBox hBox = new HBox();
hBox.setSpacing(5.0);
hBox.getChildren().addAll( button, textField);
primaryStage.setScene(new Scene( hBox, 640, 480));
primaryStage.show();
}
}
请注意,我的示例中的事件每500ms触发一次。所以按钮必须至少下降500ms。如果您想在短按按下时触发事件,则必须在ChangeListener的实现中考虑这一点。这完全取决于你真正需要的东西。