亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX TextArea 獲取 scrollTop 百分比

JavaFX TextArea 獲取 scrollTop 百分比

泛舟湖上清波郎朗 2022-07-14 17:14:19
我有一個可垂直滾動的 TextArea ( wrapTextis true),我想顯示它的滾動百分比。我創建了一個這樣的監聽器:textArea.scrollTopProperty().addListener(new ChangeListener<Number>() {    @Override    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {        final float percentage = newValue / denominator * 100.0f;        System.out.println("Scroll top: " + percentage);    }});所以看起來我需要檢索一些屬性才能將其用作denominator. 任何幫助將不勝感激!謝謝。
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

您需要ScrollBar從TextArea. 訪問它的唯一方法是使用以下lookup()方法:


ScrollBar scrollBar = (ScrollBar) textArea.lookup(".scroll-bar:vertical");

請注意,這必須在屏幕上呈現后完成。TextArea


從那里,您可以設置幾個綁定到 aLabel以顯示當前滾動的百分比:


DoubleProperty scrollPercentage = new SimpleDoubleProperty();

scrollPercentage.bind(Bindings.createDoubleBinding(() -> scrollBar.valueProperty().get() * 100, scrollBar.valueProperty()));


label.textProperty().bind(Bindings.format("%,.2f", scrollPercentage));

這是一個簡單的 MCVE 來演示:


import javafx.application.Application;

import javafx.application.Platform;

import javafx.beans.binding.Bindings;

import javafx.beans.property.DoubleProperty;

import javafx.beans.property.SimpleDoubleProperty;

import javafx.geometry.Insets;

import javafx.geometry.Pos;

import javafx.scene.Scene;

import javafx.scene.control.Label;

import javafx.scene.control.ScrollBar;

import javafx.scene.control.TextArea;

import javafx.scene.layout.Priority;

import javafx.scene.layout.VBox;

import javafx.stage.Stage;


public class ScrollBarPercentage extends Application {


    public static void main(String[] args) {

        launch(args);

    }


    @Override

    public void start(Stage primaryStage) {


        // Simple Interface

        VBox root = new VBox(10);

        root.setAlignment(Pos.CENTER);

        root.setPadding(new Insets(10));


        // Simple TextArea

        TextArea textArea = new TextArea() {{

            setWrapText(true);

            setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec suscipit posuere sodales. Mauris sodales velit vel sollicitudin volutpat. Sed rhoncus sodales sagittis. Duis ut congue mauris, sit amet tincidunt lacus. Mauris convallis convallis massa, in cursus nulla sollicitudin et. Etiam quis congue mi, nec tempor tellus. Praesent sed mollis ante. Curabitur fermentum volutpat massa, non dapibus tortor rutrum et. Sed lorem dui, pharetra ac lacus non, ultricies varius enim. Ut nec ante lectus. Vestibulum scelerisque vulputate facilisis. Cras commodo sapien eros, eu pellentesque massa congue vel. Aliquam urna neque, elementum iaculis justo eget, semper ullamcorper magna.\n\n" +

                    "Suspendisse ultricies porta auctor. Praesent ultrices lectus sed maximus ultricies. Nulla pharetra, augue in luctus fringilla, enim turpis auctor turpis, eu ullamcorper metus ligula ac nisl. Quisque accumsan tempus varius. Mauris blandit erat eget enim tempor accumsan. Nam iaculis libero a est sollicitudin, non fermentum ex viverra. Vivamus pharetra neque non augue feugiat efficitur. In hac habitasse platea dictumst. Aliquam tempor enim blandit blandit tempor. Ut porta ex sed congue maximus. Nulla non tortor est. Integer vel placerat lectus, vel tempus justo. Vestibulum ut dui sit amet mauris maximus ultricies vel in quam. Fusce suscipit volutpat magna eget ornare. Donec elementum ultricies tortor, volutpat porta enim fermentum sit amet.\n\n" +

                    "Aenean id erat at metus accumsan sodales. Suspendisse sed nisi iaculis, congue lectus et, efficitur nibh. Curabitur placerat erat et justo blandit porttitor. Nam mollis tempor magna, sed rutrum neque. Nunc mollis nunc posuere ex iaculis elementum. Nunc quam diam, aliquam ut ex mollis, facilisis varius ligula. Donec nec venenatis nunc, et auctor mi.");


        }};

        VBox.setVgrow(textArea, Priority.ALWAYS);


        // Label to display percentage scrolled

        Label label = new Label();


        // Since the lookup will only work after the TextArea has been rendered in the Scene, we need to retrieve it later with the runLater() method

        Platform.runLater(() -> {


            // Get the ScrollBar from the TextArea using a lookup

            ScrollBar scrollBar = (ScrollBar) textArea.lookup(".scroll-bar:vertical");


            // Now create a DoubleProperty that we'll bind to our scroll value * 100

            DoubleProperty scrollPercentage = new SimpleDoubleProperty();

            scrollPercentage.bind(Bindings.createDoubleBinding(() -> scrollBar.valueProperty().get() * 100, scrollBar.valueProperty()));


            // Bind the label to show a formatted percentage of the scrolling

            label.textProperty().bind(Bindings.format("%,.2f", scrollPercentage));


        });


        root.getChildren().addAll(textArea, new Label("Scrolled:"), label);


        // Show the stage

        primaryStage.setScene(new Scene(root));

        primaryStage.setTitle("Sample");

        primaryStage.show();

    }

}

結果:

https://i.stack.imgur.com/ngoR6.png

查看完整回答
反對 回復 2022-07-14
  • 1 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號