我正在自学 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] 删除。
我来说两句