JavaFX滚动窗格没有';t填充它';s父窗格

JavaFX滚动窗格没有';t填充它';s父窗格,java,javafx,scrollpane,Java,Javafx,Scrollpane,我正在努力学习JavaFX。为此,我一直在尝试制作一个文本编辑器,其中包括多行文本框支持,以及语法高亮显示的可能性 目前,我面临的最大问题是,我封装了所有流程窗格的滚动窗格不会根据其所在窗格的大小调整大小。我已经研究这个问题大约半个星期了,根本无法让滚动窗格填满它所在的窗口。下面的代码显示了一个具有工作键盘输入的JavaFX阶段,并且滚动窗格的大小始终相同。提前感谢大家 以下是我的主要观点: import javafx.application.Application; import javafx

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

目前,我面临的最大问题是,我封装了所有流程窗格的滚动窗格不会根据其所在窗格的大小调整大小。我已经研究这个问题大约半个星期了,根本无法让滚动窗格填满它所在的窗口。下面的代码显示了一个具有工作键盘输入的JavaFX阶段,并且滚动窗格的大小始终相同。提前感谢大家

以下是我的主要观点:

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()));
    }
}
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.EventHandler;
导入javafx.geometry.Bounds;
导入javafx.geometry.Orientation;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.FlowPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.text.text;
公共类DynamicTextBox扩展窗格{
//currentLinePane用于处理所有直接用户输入
//MultiLine虽然尚未真正使用,但在按下enter键时将创建新行。
专用流程窗格currentLinePane,多行窗格;
私有滚动窗格编辑器Croller;
公共DynamicTextBox(){
超级();
currentLinePane=新流程窗格(方向为水平);
多行窗格=新的流程窗格(方向为垂直);
multiLinePane.getChildren().add(currentLinePane);
editorScroller=新滚动窗格(多页);
editorScroller.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_所需);
editorScroller.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
editorScroller.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
配置输入(事件);
}
});
super.getChildren().add(editorScroller);
editorScroller.requestFocus();
}
私有无效配置输入(KeyEvent事件){
currentLinePane.getChildren().add(新文本(event.getText());
}
}
您正在使用

ScrollPane.ScrollBarPolicy.AS_需要时

根据Oracle的文档,这“表示在需要时应显示一个滚动条”

ScrollPane.ScrollBarPolicy.ALWAYS

或者,回想一下,这些都是常量。您可以使用
boundsInParent
获取父对象的高度:


或者,您可以使用
getParent()
获取父对象,然后使用
computeMinWidth()

hmm获取其高度,这是我特意使用的滚动条策略,效果非常好,这就是我想要的。当我运行这个程序时,我找不到它为什么选择这个随机大小的原因。到目前为止,我对切换到javafx的想法很不满意哈,我已经知道swing,虽然swing有很多怪癖,但我很确定它会根据窗口大小调整流窗格。实际上,我可能刚刚发现了一些好的东西,我的流窗格可能是罪魁祸首,因为它们的默认包装长度显然是400