gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:31:50 25 4
gpt4 key购买 nike

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

例如,如果用户在 Windows 上键入字母“t”,则找到的第一个字体是 Tahoma。因此,文本字段将设置为 Tahoma,克拉将位于“T”之后,并且“ahoma”将突出显示。相反,该字段填充了 Tahoma,克拉位于末尾,没有突出显示任何内容。因此,它就像忽略了用于定位和突出显示的两行代码,或者事件处理器导致我对 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();
});

关于java - 尝试在 JavaFX 中以编程方式选择不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com