我想创建一个自定义文本编辑组件。基本上我需要一个能够设置插入符号并以自定义方式处理关键事件的文本。有没有办法在 JavaFX 中这样做?Text 上有特定于实现的方法(已弃用,评论说它们应该被视为私有),但我不能使用它们。
是否可以在 JavaFX 中这样做?
如果使用 TextField 或 TextArea,它们都是TextInputControl的子类。TextInputControl 提供了一个caretPositionProperty,您可以使用它来读取和修改插入符号的位置。所有场景图对象(包括 TextField 和 TextArea)都是Node的实例。节点允许您设置自定义EventHandlers和事件过滤器。您可以使用事件处理程序来覆盖 TextInputControls 的默认键处理处理程序,以便您可以实现自己的处理。
如果您需要通过自定义 TextField 或 TextArea 实例无法获得的进一步自定义功能,那么您可以创建自己的 TextInputControl 子类并根据需要实现自定义文本编辑组件,但由于复杂性,我不会真正建议这种方法以及可能最终需要的对内部 JavaFX api 的依赖。
TextField 对我不起作用,因为: 1. 它有一个边框,表示焦点,我不知道如何删除。
这是JavaFX 2.2 默认 caspian.css 样式表的链接。您可以设置 TextField 的样式以移除焦点边框,方法是将其 :focused 伪类选择器样式设置为与默认选择器相同的值。例如:
.text-field:focused {
-fx-background-color: -fx-shadow-highlight-color, -fx-text-box-border, -fx-control-inner-background;
-fx-background-insets: 0, 1, 2;
-fx-background-radius: 3, 2, 2;
}
有关如何在 JavaFX 中使用 css 的信息,请参阅JavaFX css 参考指南。
TextField 对我不起作用,因为: 2. 它具有固定的列数,我需要动态更改宽度。
TextField 是一个可调整大小的控件,如果将其放置在具有适当约束的可调整大小的布局窗格中,它将动态更改其宽度。TextField 中的列数设置是首选列数,而不是固定列数。
有关 JavaFX 布局的更多信息,请参阅JavaFX 布局文档。