【问题标题】:JavaFX ScrollPane doesn't fill it's parent paneJavaFX ScrollPane 没有填充它的父窗格
【发布时间】:2015-06-10 09:34:04
【问题描述】:

我正在努力学习 JavaFX。为此,我一直在尝试制作一个文本编辑器,其中包含多行文本框支持,以及未来语法高亮的可能性。

目前,我面临的最大问题是我封装所有 FlowPane 的 ScrollPane 不会根据它所在的 Pane 的大小调整大小。我已经研究了这个问题大约一半现在一周了,根本无法让 ScrollPane 填充它所在的窗口。下面的代码显示了一个 JavaFX 阶段,该阶段具有有效的键盘输入,并且无论如何 ScrollPane 总是相同的大小。在此先感谢大家!

这是我的主要内容:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Launcher extends Application {
    public static void main(String[] args) {
        launch(args);
    }


    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(new DynamicTextBox(),500,500));
        primaryStage.show();
    }
}

文本框类:

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.geometry.Orientation;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;

public class DynamicTextBox extends Pane {
    //currentLinePane is made to handle all the direct user inputs
    //multiLinePane, while not really used yet will create a new line when                   the enter key is struck.
    private FlowPane currentLinePane, multiLinePane;
    private ScrollPane editorScroller;

    public DynamicTextBox() {
        super();

        currentLinePane = new FlowPane(Orientation.HORIZONTAL);
        multiLinePane = new FlowPane(Orientation.VERTICAL);
        multiLinePane.getChildren().add(currentLinePane);

        editorScroller = new ScrollPane(multiLinePane);
        editorScroller.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
        editorScroller.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        editorScroller.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                configureInput(event);
            }
        });

        super.getChildren().add(editorScroller);
        editorScroller.requestFocus();
    }

    private void configureInput(KeyEvent event) {
        currentLinePane.getChildren().add(new Text(event.getText()));
    }
}

【问题讨论】:

    标签: java javafx scrollpane


    【解决方案1】:

    你正在使用

    ScrollPane.ScrollBarPolicy.AS_NEEDED

    根据 Oracle 的文档,“表示在需要时应该显示滚动条。”相反,使用

    ScrollPane.ScrollBarPolicy.ALWAYS

    或者,回想一下这些是常量。您可以使用boundsInParenthttps://docs.oracle.com/javafx/2/api/javafx/scene/Node.html#boundsInParentProperty获取父级的高度

    或者,您可以使用getParent() 获取父级,然后使用computeMinWidth() https://docs.oracle.com/javafx/2/api/javafx/scene/Node.html#getParent() 获取其高度

    【讨论】:

    • hmm,好吧,我故意做的滚动条策略,效果很好,这就是我想要的。当我运行它时,我没有理由找到它为什么选择这个随机大小。到目前为止,我对切换到 javafx 感到很厌烦,哈哈,我已经知道 swing,虽然 swing 有很多怪癖,但我很确定它只会根据窗口大小调整 FlowPane
    • 实际上我可能刚刚发现了一些好东西,我的 FlowPanes 可能是罪魁祸首,因为显然它们的默认环绕长度是 400 docs.oracle.com/javafx/2/api/javafx/scene/layout/FlowPane.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2018-08-12
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多