JavaFX TextArea - 控制滚动条大小

时间:2018-02-08 18:39:40

标签: javafx

TextArea CSS字体大小令人不快地对滚动条的大小产生了古怪的影响,我试图自己控制尺寸。请参阅以下SSCCE。我可以轻松控制垂直滚动条,但水平条只是忽略了我设置的尺寸。我在这里期待一些不合理的东西,还是JavaFX中的这个(又一个)错误?谢谢!

enter image description here

public class Main extends Application { 
    public static void main(String[] args) {
        launch(args);
    }   
    @Override
    public void start(Stage primaryStage) {

        TextArea textArea = new TextArea();
        int lineCount = 100;
        int wordCount = 70;
        StringBuilder sb = new StringBuilder();

        for (int lineNbr = 0; lineNbr < lineCount; lineNbr++) {
            for (int wordNbr = 0; wordNbr < wordCount; wordNbr++) {
                sb.append("Sample");
            }
            sb.append(System.getProperty("line.separator"));
        }

        textArea.setText(sb.toString());

        StackPane root = new StackPane();
        root.getChildren().add(textArea);

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();

        double prefSize = 50;
        ScrollBar vertScrollBar = (ScrollBar)textArea.lookup(".scroll-bar:vertical");
        ScrollBar horizScrollBar = (ScrollBar)textArea.lookup(".scroll-bar:horizontal");

        vertScrollBar.setPrefWidth(prefSize); // This works great!

        horizScrollBar.setPrefHeight(prefSize); // This doesn't do anything!
        horizScrollBar.setMinHeight(prefSize); // Nor does this
        horizScrollBar.setPrefWidth(prefSize); // Nor this
        horizScrollBar.setMinWidth(prefSize); // Nor this

    }
}

2 个答案:

答案 0 :(得分:1)

ScrollBar vertScrollBar = (ScrollBar) textArea.lookup(".scroll-bar:vertical");
ScrollBar horizScrollBar = (ScrollBar) textArea.lookup(".scroll-bar:horizontal");
System.out.println(vertScrollBar + " " + horizScrollBar);
  

滚动条@ 35ef2d94 [的styleClass =滚动条]   滚动条@ 35ef2d94 [的styleClass =滚动条]

相同对象(垂直ScrollBar)。

    ScrollPane sPane = (ScrollPane)textArea.getChildrenUnmodifiable().get(0);
    ScrollBar horizScrollBar = (ScrollBar)sPane.getChildrenUnmodifiable().get(2);
    horizScrollBar.setPrefHeight(prefSize); // This does something!

Image

更新:更好的方式来接收两个ScrollBars。

ScrollBar[] bars = new ScrollBar[2];
textArea.lookupAll(".scroll-bar").toArray(bars);
bars[0].setPrefWidth(prefSize);
bars[1].setPrefHeight(prefSize);

编辑:查找与lookupAll(...)和伪类herehere类似的问题。

答案 1 :(得分:0)

查找通常非常脆弱(而且我认为它们并不是真的非常强大);如其他答案中的链接所示,它们似乎不支持伪类。

你当然可以使用CSS:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application { 
    public static void main(String[] args) {
        launch(args);
    }   
    @Override
    public void start(Stage primaryStage) {

        TextArea textArea = new TextArea();
        int lineCount = 100;
        int wordCount = 70;
        StringBuilder sb = new StringBuilder();

        for (int lineNbr = 0; lineNbr < lineCount; lineNbr++) {
            for (int wordNbr = 0; wordNbr < wordCount; wordNbr++) {
                sb.append("Sample");
            }
            sb.append(System.getProperty("line.separator"));
        }

        textArea.setText(sb.toString());

        StackPane root = new StackPane();
        root.getChildren().add(textArea);

        Scene scene = new Scene(root, 300, 250) ;

        scene.getStylesheets().add("style.css");

        primaryStage.setScene(scene);
        primaryStage.show();

    }
}

style.css中的以下内容:

.scroll-pane .scroll-bar:horizontal {
    -fx-pref-height: 50 ;
}
.scroll-pane .scroll-bar:vertical {
    -fx-pref-width: 50 ;
}

enter image description here

当然,如果您的应用程序中有多个滚动窗格并且希望它们都具有相同的滚动条样式,那么这种方法会更方便。