尝试在 JavaFX 中以编程方式选择不起作用

马克伯纳德

我正在自学 JavaFX。来自 Swing 世界,两者之间有很多相似之处。尤其是事件处理。我的过程的一部分是尽可能地尝试和模仿现有的应用程序。我正在做的一件事是创建一个对话框,允许用户选择要使用的字体。有一个文本字段供他们输入字体名称和一个列表,他们可以在其中滚动并选择一个。当他们开始输入时,列表将自动滚动到列表中以开始匹配用户正在输入的内容。我还尝试使用当前匹配的字体名称填充文本字段,然后突出显示用户尚未键入的部分,以便他们可以继续键入,直到找到正确的匹配项。

例如,如果用户在 Windows 上键入字母“t”,则找到的第一个字体是 Tahoma。因此,文本字段将设置为 Tahoma,克拉将位于“T”之后,并且“ahoma”将突出显示。相反,该字段填充了 Tahoma 并且克拉位于末尾并且没有任何突出显示。因此,它就像忽略了用于定位和突出显示的 2 行代码,或者事件处理器导致我对 JavaFX 库的调用无序运行。

我认为这可能是 JavaFX 的一个错误,但也可能是我对事件系统的误解。请让我知道是哪一个以及为什么。

这是显示问题的完整示例代码。只需开始在文本字段中输入即可试用。

package test;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class TestTyping extends Application {
    ChangeListener<String> textChange;
    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        TextField text = new TextField();
        root.setTop(text);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();

        textChange = (observable, oldValue, newValue) -> {
            text.textProperty().removeListener(textChange);
            for (String family : Font.getFamilies()) {
                if (family.equalsIgnoreCase(newValue) || family.toLowerCase().startsWith(newValue.toLowerCase())) {
                    text.setText(family);
                    text.positionCaret(newValue.length());
                    text.selectEnd();
                    break;
                }
            }
            text.textProperty().addListener(textChange);
        };
        text.textProperty().addListener(textChange);
    }

    public static void main(String... args) {
        launch(args);
    }
}
机械制造商

包裹插入符号位置并选择 end 到Platform.runLater. 问题出在事件顺序上。我不知道有关此问题的正确详细信息,因此我不会为您提供详细答案,仅提供解决方案。

Platform.runLater(()-> {
    text.positionCaret(newValue.length());
    text.selectEnd();
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章