JavaFX ScrollPane没有填充它的父窗格

时间:2015-04-05 23:56:55

标签: java javafx scrollpane

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

目前,我所面临的最大问题是ScrollPane我已经根据其所在的Pane大小封装了所有我的FlowPanes。我现在已经研究了这个问题大约半个星期了,根本无法让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();
    }
}

TextBox类:

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()));
    }
}

1 个答案:

答案 0 :(得分:0)

您正在使用

ScrollPane.ScrollBarPolicy.AS_NEEDED

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

ScrollPane.ScrollBarPolicy.ALWAYS

或者,回想一下这些是常数。您可以使用boundsInParent获取父级的高度:https://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()

获取其高度