JavaFX禁用TextArea滚动

时间:2016-05-26 19:43:28

标签: javafx textarea

我一直在尝试使用以下代码禁用文本区域中的滚动条:

ScrollBar scrollBarv = (ScrollBar)textArea.lookup(".scroll-bar:vertical");
scrollBarv.setDisable(true);

但我得到的是" scrollBarv"的空指针。我错过了什么?

1 个答案:

答案 0 :(得分:2)

您无法通过查找来禁用文本区域中的滚动条,就像您尝试的那样。

查找是基于CSS的,这通常意味着它只能在应用CSS应用程序传递后才能工作。通常,要使查找按预期工作,还需要在父节点或场景上应用布局传递。 JavaFX布局处理程序中用于复杂节点(如控件)的逻辑可以修改控件的CSS和节点。

要了解如何应用CSS并执行布局传递,请阅读相关的applyCss()文档。

所以你可以这样做:

textArea.applyCss();
textArea.layout();
ScrollBar scrollBarv = (ScrollBar)textArea.lookup(".scroll-bar:vertical");
scrollBarv.setDisable(true);

但即便如此,它也不会做你想要的。因为这只是一次性通话。如果用户在填充区域之前将新文本键入空TextArea,则会显示滚动条,如果用户删除文本区域中的文本,则会删除滚动条。当您进行查找时,会显示新的滚动条,因为它在当时不存在。

通常,对节点执行查找的首选替代方法是应用CSS样式类,其样式类定义节点的所需属性,而不管其处于何种状态(如果需要基于状态的CSS定义,则使用伪类)。但是,在这种情况下,这可能不会起作用,因为我无法在JavaFX CSS reference guide中看到禁用属性的定义。也许你可以通过visibility属性管理你需要的东西,尽管这不太可能,因为可见性与禁用有点不同。

控制滚动条的行为在TextAreaSkin内部编码(在Java 8中不是公共JavaFX API的一部分)。您可以复制或子类化TextAreaSkin以自定义其行为,然后attach your customized skin to your node。这真的是"正确的"以您希望的方式自定义内部控制行为的方法。讨论实现这一目标的详细步骤超出了本答复的范围。

但是,最后,我不确定你想要的行为有多么有用。您可以只禁用整个TextArea,而不是禁用垂直滚动条,这对大多数类似的用例来说都没问题。但是,或许你的用例在某种程度上是不同的,只需要禁用垂直滚动条。

相关问题