JavaFX滚动面板无法填充其父面板

3
我正在学习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()));
    }
}
1个回答

0

你正在使用

ScrollPane.ScrollBarPolicy.AS_NEEDED

根据Oracle文档,该属性表示“当需要时应显示滚动条”。建议使用其他方式。

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


嗯,滚动条策略是我故意设置的,而且完全正常,这就是我想要的。当我运行它时,我找不到任何原因为什么会选择这个随机大小。我对转换到JavaFX感到有点不满,因为我已经了解Swing,尽管Swing有很多怪癖,但我相信它只会根据窗口大小调整FlowPane。 - Ben Rasmussen
其实我可能找到了一些好东西,我的FlowPanes可能是罪魁祸首,因为它们的默认换行长度显然是400 https://docs.oracle.com/javafx/2/api/javafx/scene/layout/FlowPane.html - Ben Rasmussen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接