2016-06-09 64 views
-2

假設我有一個EventHandler<KeyEvent> keyEvent = event -> {...};如何在EventHandler中觸發一個KeyEvent? (JavaFX)

我將如何調用該事件? fireEvent()需要一個Event,我試圖投到EventfireEvent((Event) keyEvent);但它不會工作。

+0

你爲什麼不只是定義包含在事件處理程序代碼的方法,直接調用它? –

+0

不是EventHandler句柄中的唯一函數嗎? – Vasting

+0

那麼你使用的是lambda表達式,所以這個方法甚至沒有名字。我的意思是,定義另一個方法並從處理程序中調用它,並在需要時從其他地方調用它。 –

回答

1

如果您的處理器不使用的情況下,那麼你可以做

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); 
    } 
}