- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个 TextArea (JavaFX),一旦我用文本填充它,就会出现一个滚动条...而不需要专门添加它。
作为我的程序的一部分,我想知道滚动条何时靠近 TextArea-ScrollPane 的底部。
我知道我可以使用 TextArea.scrollTopProperty() 获取滚动条的位置,但是无法将其与 TextArea.getHeight() 进行比较,因为这些值似乎不遵循任何比例(我可以看到) .
那么谁能告诉我如何确定滚动条何时接近其底部/开始或顶部/结束?
最佳答案
scrollTopProperty
是垂直滚动的量,以像素为单位。最大数量是视口(viewport)大小与滚动的实际文本大小之间的差异。您可以通过查找获取这些:CSS documentation指定滚动 Pane 及其内容的类名称。
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class TextAreaScrollMonitor extends Application {
@Override
public void start(Stage primaryStage) {
TextArea textArea = new TextArea();
textArea.setWrapText(true);
DoubleProperty percentScrolled = new SimpleDoubleProperty();
percentScrolled.bind(Bindings.createDoubleBinding(() -> {
Node text = textArea.lookup(".content");
Node scrollPane = textArea.lookup(".scroll-pane");
if (text == null || scrollPane == null) {
return 0.0 ;
}
double textHeight = text.getLayoutBounds().getHeight();
double textAreaHeight = ((ScrollPane) scrollPane).getViewportBounds().getHeight();
if (textHeight <= textAreaHeight) {
return 100.0 ;
}
return 100.0 * textArea.getScrollTop() / (textHeight - textAreaHeight) ;
}, textArea.scrollTopProperty()));
Label label = new Label();
label.textProperty().bind(percentScrolled.asString("Percent scrolled: %.1f"));
textArea.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+ "Curabitur ornare tellus et libero dignissim, consectetur sollicitudin ante vulputate. "
+ "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
+ "Integer rhoncus suscipit ligula eget maximus. Sed luctus viverra suscipit. Curabitur ac ligula "
+ "faucibus erat aliquet gravida sit amet a mauris. Cras vestibulum urna lacus, ac congue risus congue sed. "
+ "Duis massa enim, pharetra sit amet tellus vitae, consectetur ullamcorper nunc. "
+ "Integer lobortis porta lectus sed cursus. Suspendisse gravida felis tellus, "
+ "nec sagittis felis cursus eu. Proin dictum ac nisl in aliquet. "
+ "Etiam placerat consectetur placerat. Cras commodo mauris augue, nec tincidunt mauris posuere et. "
+ "Mauris rhoncus ex ac elit ullamcorper, tempor tincidunt odio volutpat.Nullam est odio, blandit in ex id, "
+ "pellentesque rutrum odio. Nullam aliquam sem turpis, eget auctor sapien fermentum sollicitudin. "
+ "Sed ullamcorper, nisi et fermentum tristique, sem urna fermentum massa, vitae tincidunt risus nisi et nisi. "
+ "Aliquam sagittis urna at elit tincidunt, eu lobortis leo vulputate. Vivamus id suscipit lorem. "
+ "Quisque sed nibh nec sem finibus suscipit aliquam eget felis. Suspendisse pulvinar venenatis augue, "
+ "at egestas nibh malesuada sit amet. Vivamus eget egestas velit. Nullam quis placerat elit. "
+ "Morbi aliquam velit nunc, a varius ipsum ultricies quis. Phasellus dui odio, viverra a sapien at, "
+ "auctor iaculis nunc.Praesent mauris nibh, dignissim vitae massa a, dapibus rutrum enim. "
+ "Aliquam aliquam tincidunt erat nec posuere. Ut elementum vel velit quis interdum. "
+ "Proin eget dapibus sapien. Cras faucibus urna nulla, sed volutpat ligula efficitur nec. "
+ "Aenean non ullamcorper nulla. Curabitur quis arcu sit amet nunc lacinia consectetur vitae nec elit. "
+ "In quis mollis dui. Morbi consectetur condimentum erat. Curabitur ut mollis dui. "
+ "Proin molestie gravida tempus.Nam consequat interdum odio at condimentum. Vestibulum augue tellus, "
+ "dignissim ac sem et, iaculis cursus massa. Donec facilisis nunc at erat malesuada, in luctus felis dictum. "
+ "Vivamus scelerisque accumsan tellus, eget gravida mauris. Etiam eu elit auctor nisl efficitur pretium. "
+ "Duis non eros arcu. Pellentesque tempus nibh et lorem ornare, at placerat sapien placerat. "
+ "Ut iaculis lectus at libero condimentum blandit. Vestibulum euismod dolor ut egestas laoreet. "
+ "Phasellus tempus at enim at posuere. Donec erat eros, mattis et justo fringilla, laoreet interdum tellus."
+ "In vehicula hendrerit nulla, sed ultrices neque rhoncus a. Proin vel volutpat lectus. "
+ "Sed egestas tellus ac consectetur elementum. Donec dolor ipsum, auctor eu turpis feugiat, "
+ "ullamcorper efficitur quam. Cras efficitur libero pulvinar magna tincidunt, eget faucibus libero suscipit. "
+ "Fusce elementum nulla vel magna porttitor elementum. Quisque accumsan euismod porttitor. "
+ "Sed nec sem non nisi aliquam consequat sit amet et metus. Curabitur facilisis enim non tristique tristique. "
+ "Morbi purus libero, molestie non purus ut, commodo semper dui. Quisque tellus nunc, porttitor ac egestas id, "
+ "venenatis vitae felis. Curabitur convallis dui lectus, eu sodales leo laoreet nec. Integer interdum pharetra dolor, "
+ "vitae sodales augue cursus sit amet.Aliquam ut turpis accumsan, lacinia felis eu, tristique eros. "
+ "Nullam laoreet eros tortor, et egestas augue sagittis nec. "
+ "Nam sit amet odio non eros maximus interdum sit amet et dolor. Nunc blandit tincidunt.");
Scene scene = new Scene(new BorderPane(textArea, label, null, null, null));
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
关于java - TextArea高度与滚动条scrollTop属性的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795407/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!