簡體   English   中英

JavaFX:textArea.setScrollTop(Double.MAX_VALUE)並不總是有效

[英]JavaFX: textArea.setScrollTop(Double.MAX_VALUE) not always works

這是我的代碼。

textArea.setText(someNewText)
textArea.positionCaret(textArea.getText().length());
textArea.setEditable(true);
textArea.setScrollTop(Double.MAX_VALUE);

我使用textArea.setScrollTop(Double.MAX_VALUE)將textarea滾動到底部(我在互聯網上找到的解決方案)。 它有效,但並非總是如此。 我注意到它只有在調用此代碼之前看不到垂直滾動條並且在執行代碼后可見時才能工作。 在調用此代碼之前顯示垂直滾動條時,滾動到底部始終有效。 怎么解決? 也許我應該讓垂直滾動條始終可見? 如果是,那么如何 - 我沒有找到解決方案。

編輯:這是示例代碼:

public class JavaFxApp1 extends Application{

    private TextArea textArea;

    @Override
    public void start(Stage stage) throws Exception {
        Button button=new Button("Press here");
        textArea=new TextArea();
        VBox vbox = new VBox(button,textArea);
        button.setOnAction((event)->{
            textArea.appendText("###This is a very long string:some text some text some text some text some"
                    + " text some text some text some text some text some text"
                    + " text some text some text some text some text some text"
                    + " text some text some text some text some text some text .\n");
            textArea.selectEnd();
            textArea.deselect();
            textArea.setScrollTop(Double.MAX_VALUE);
        });
        textArea.setEditable(true);
        textArea.setWrapText(true);
        textArea.setStyle("-fx-font-size:14px;-fx-focus-color: transparent;-fx-font-family: monospace;");
        Scene scene=new Scene(vbox);
        stage.setTitle("SomeTitle");
        stage.setScene(scene);
        stage.setMinHeight(400);
        stage.setMinWidth(800);
        stage.show();
    }
}

這是我按下按鈕4次時的結果: 在此輸入圖像描述 如你所見,它沒有滾動到底部。 再次按下按鈕(第五次)后,我得到以下結果: 在此輸入圖像描述 現在,正如您所看到的那樣滾動到底部。 我試着添加:

ScrollPane scrollPane = (ScrollPane) textArea.lookup(".scroll-pane");  
scrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS);

使滾動條始終可見 - 它是可見的但是4次后仍然不會滾動到底部。

怎么解決?

如果你想滾動到頂部你的代碼就是這樣

ta.selectHome();
ta.deselect();

如果你想滾動到底部你的代碼就是這樣

ta.selectEnd();
ta.deselect();

現在讓TextArea擔心它的可見區域

編輯

也許我沒有得到你的要求,老實說這是我第一次看到這種方法,所以根據你的假設給出答案

也許我應該讓垂直滾動條始終可見? 如果是,那怎么樣

好吧,那就是簡單的TextArea使用ScrollPane ,當有一個可見的滾動行時,這行TextArea.getChildrenUnmodifiable().size(); 將簽出為1,因此您在創建TextArea時將其刪除

TextArea.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
        @Override
        public void onChanged(javafx.collections.ListChangeListener.
            Change<? extends Node> c) {
            while(c.next()){
                if(c.wasAdded()){
                    for(Node n : TextArea.getChildrenUnmodifiable()){
                        if(n.getClass().isAssignableFrom(ScrollPane.class)){
                            //just trying to be cool here ^^
                            ScrollPane sp = (ScrollPane) n;
                            sp.setVbarPolicy(ScrollBarPolicy.ALWAYS);
                        }
                    }
                }
            }
        }
    });

實際上你可以保留對ScrollPane的引用,並且只要你想滾動到底部的ScrollPane.setVvalue(1.0); 到頂部ScrollPane.setVvalue(0.0); 等等

您可以使用ScrollPane.getVvalue()獲取值。

這是一個錯誤。 請參閱以下鏈接https://bugs.openjdk.java.net/browse/JDK-8189732

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM