-2
假設我有一個EventHandler<KeyEvent> keyEvent = event -> {...};
如何在EventHandler中觸發一個KeyEvent? (JavaFX)
我將如何調用該事件? fireEvent()
需要一個Event
,我試圖投到Event
像fireEvent((Event) keyEvent);
但它不會工作。
假設我有一個EventHandler<KeyEvent> keyEvent = event -> {...};
如何在EventHandler中觸發一個KeyEvent? (JavaFX)
我將如何調用該事件? fireEvent()
需要一個Event
,我試圖投到Event
像fireEvent((Event) keyEvent);
但它不會工作。
如果您的處理器不使用的情況下,那麼你可以做
keyEvent.handle(null);
調用它。
如果是這樣,我只是將它分解到另一種方法,將您需要的信息作爲參數。例如。如果你只需要KeyCode
你可以這樣做:
private void processKeyPress(KeyCode code) {
// ...
}
那麼你的事件處理程序是:
// surely keyEventHandler (or similar) is a better name than keyEvent:
EventHandler<KeyEvent> keyEventHandler = e -> processKeyPress(e.getCode());
現在你只需調用processKeyPress
方法,當你需要它,例如
processKeyPress(KeyCode.ENTER);
下面是一個簡單的例子,它使用鍵入事件中的字符。請注意這兩個按鈕上的動作事件處理程序,並在現場鍵輸入處理程序如何調用processKey
方法:
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class NumberPad extends Application {
private final ObjectProperty<Number> value = new SimpleObjectProperty<>(new Integer(0));
private final StringProperty trailingZeros = new SimpleStringProperty("");
private boolean decimalPressed = false ;
private int numDecimalPlaces = 0 ;
private final Label display = new Label();
private void processKey(char c) {
if (c >= '0' && c <= '9') {
int val = c - '0' ;
if (decimalPressed) {
if (val == 0 && numDecimalPlaces > 0) {
trailingZeros.set(trailingZeros.get()+"0");
} else {
trailingZeros.set("");
}
numDecimalPlaces++ ;
value.set(new Double(value.get().doubleValue() + val * Math.pow(10, -numDecimalPlaces)));
} else {
value.set(new Integer(value.get().intValue() * 10 + val));
}
} else if (c == '.') {
decimalPressed = true ;
} else if (c == 'C') {
value.set(new Integer(0));
decimalPressed = false ;
numDecimalPlaces = 0 ;
trailingZeros.set("");
}
}
private Button createButton(char c) {
Button button = new Button(Character.toString(c));
button.setOnAction(e -> processKey(c));
button.setFont(Font.font(24));
button.setMinSize(25, 25);
button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
GridPane.setFillHeight(button, true);
GridPane.setFillWidth(button, true);
return button ;
}
@Override
public void start(Stage primaryStage) {
display.setFont(Font.font(24));
display.textProperty().bind(value.asString().concat(trailingZeros));
GridPane root = new GridPane();
root.setHgap(5);
root.setVgap(5);
root.setPadding(new Insets(10));
root.add(display, 0, 0, 3, 1);
Scene scene = new Scene(root);
scene.setOnKeyTyped(e -> processKey(e.getCharacter().charAt(0)));
for (int value = 0 ; value <= 9; value++) {
char c = (char)('0' + value) ;
Button button = createButton(c);
if (value == 0) {
root.add(button, 0, 3);
} else {
int row = 3 - (value - 1)/3 ;
int col = (value - 1) % 3 ;
root.add(button, col, row);
}
}
root.add(createButton('.'), 1, 4);
root.add(createButton('C'), 2, 4);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
你爲什麼不只是定義包含在事件處理程序代碼的方法,直接調用它? –
不是EventHandler句柄中的唯一函數嗎? – Vasting
那麼你使用的是lambda表達式,所以這個方法甚至沒有名字。我的意思是,定義另一個方法並從處理程序中調用它,並在需要時從其他地方調用它。 –