如何使用javafx键盘列表



我有一个可编辑的javafx combobox。用户必须只能

  1. 类型字母('a'to'z'),空间和圆括号('(',','))输入字符串
  2. 按TAB到EXIT
  3. 按Enter to Exit

如何过滤其他所有键,修饰符等?

我已经阅读并使用了诸如key_presse,key_realed的事件处理程序,但我无法弄清楚一种直接的方法来实现上述内容。 我正在使用Mac OS Yosemite,Java 8,最新版本的Javafx和
public static final EventType<KeyEvent> KEY_TYPED根本不起作用。下面的代码是我的尝试。变量键入存储所需的值。

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

您可以获取编辑器,这是您的情况下的文本字段,并在其中添加一个限制输入的文本形式。

tab在框中工作,但是" Enter"按键是另一回事,我只是在此示例中要求焦点。通常,您会导航到焦点遍历列表中的下一个项目,但是在Javafx中还没有适用的API。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class ComboBoxSample extends Application {
    @Override
    public void start(Stage stage) {
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.setEditable(true);
        comboBox.getItems().addAll("A", "B", "C", "D", "E");
        comboBox.setValue("A");

        // restrict input
        TextField textField = comboBox.getEditor();
        TextFormatter<String> formatter = new TextFormatter<String>(change -> {
            change.setText(change.getText().replaceAll("[^a-z ()]", ""));
            return change;
        });
        textField.setTextFormatter(formatter);
        // dummy textfield to jump to on ENTER press
        TextField dummyTextField = new TextField();
        comboBox.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if( e.getCode() == KeyCode.ENTER) {
                dummyTextField.requestFocus();
                e.consume();
            }
        });
        HBox root = new HBox();
        root.getChildren().addAll(comboBox, dummyTextField);
        Scene scene = new Scene(root, 450, 250);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

最新更新