0
我有一個可編輯的JavaFX組合框。 用戶必須只能如何使用JavaFX KeyListeners?
- 類型的字母(「a」到「Z」),空間和圓形括號(「(」,「)」),以輸入的字符串
- 按標籤來退出
- 按Enter鍵退出
如何過濾掉所有其他鍵,改性劑等?
我已閱讀並使用了Key_Pressed,Key_Released等事件處理函數,但我無法找出實現上述的直接方法。 我使用的是Mac OS Yosemite,Java 8,最新版本的JavaFX和
public static final EventType<KeyEvent> KEY_TYPED
根本不起作用。 下面的代碼是我的嘗試。變量typedText存儲所需的值。
comboBox.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
private final String[] allowedItems = new String[]{"a","b","c","d","e","f",
"g","h","i","j","k","l","m","n","o","p","q","r",
"s","t","u","v","w","x","y","z"," ","(",")"};
private final List data = Arrays.asList(allowedItems);
private String tempInput;
public boolean containsCaseInsensitive(String s, List<String> l){
for (String string : l) {
if (string.equalsIgnoreCase(s)){
return true;
}
}
return false;
}
public void handle(KeyEvent event) {
boolean b;
b = event.isShiftDown();
if (b) {
if (event.getText().equals("(")) {
tempInput = "(";
} else if (event.getText().equals(")")){
tempInput = ")";
}
} else {
tempInput = event.getCode().toString().toLowerCase();
}
System.out.println("tempInput:"+tempInput);
if (containsCaseInsensitive(tempInput, data)) {
typedText = tempInput;
System.out.println("typedText:"+typedText);
}
}
});
}
請分享您的成就。 – async
JavaFX事件循環是雙向的,即事件消息從系統調度並滲透到您的控制中......然後從控制系統中迴流到系統。 FX爲處理事件定義的兩個抽象是「過濾器」和「處理程序」。過濾器捕獲到達控件的消息,處理程序在返回時捕獲消息。對於你的情況,你可能希望使用過濾器。否則,事件將由控件處理,然後由處理程序處理。 – scottb
此外,您的代碼段不包含任何對'consume()'的調用。如果您沒有在過濾器中使用事件消息,則它將繼續傳遞給控件。當您希望定義與控件的默認行爲不同的自定義行爲時,您需要使用該事件,以便控件不會處理該事件。 – scottb