如何设置JavaFX ScrollPane的最大大小并使Scrollbars仅在需要时显示?

时间:2016-02-08 13:37:14

标签: java javafx javafx-8

我正在尝试构建单个窗口应用程序以更好地了解JavaFX。这是非常好的和容易的,直到我没有深入细节...

我有一个AnchorPane作为其他GUI元素的主要容器。我意识到,它对我的​​笔记本电脑屏幕来说太高了(805像素高,600像素宽),所以当我收缩窗口时,我决定将AnchorPane放在ScrollPane中以使用滚动条。 AnchorPane在FXML中配置,ScrollPane是Java源代码。

AnchorPane:

<AnchorPane maxHeight="805.0" prefHeight="805.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.jzoli.mp3checker.view.MainWindowController">

...

ScrollPane:

public class ScrollableMainFrame extends ScrollPane {

public ScrollableMainFrame(Pane content) {
    super();

    // set scrollbar policy
    this.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
    this.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);

    // set the main window in the scroll pane
    this.setContent(content);
}

}

然后我加载FXML,将AnchorPane放入Scrollpane中,然后让它显示:

private final void initWindow() {
    try {
        // Load main window layout from fxml file.
        URL mainWindowURL = MainApp.class.getResource("view/MainWindow.fxml");
        FXMLLoader loader = new FXMLLoader(mainWindowURL, guiLabels);
        mainWindow = (AnchorPane) loader.load();
        MainWindowController controller = loader.getController();
        controller.setMainAppAndGUILabels(this);

        // create a scrollable Pane, and put everything inside
        scrollableMainFrame = new ScrollableMainFrame(mainWindow);

        // Show the scene containing the layout.
        Scene scene = new Scene(scrollableMainFrame);
        primaryStage.setScene(scene);            
        primaryStage.show();
    } catch (IOException e) {
        LOG.error("Error loading GUI!", e);
    }
}

到目前为止一切顺利,窗口显示并且没有滚动条,直到我不收缩它。 但是我想最大化我的窗口,因为它没有意义使它更大(AnchorPane具有固定的大小),只是更小。 我已经弄清楚了,必须设置PrimaryStage的Max大小来限制实际窗口,限制ScrollPane没有效果。

这就是问题所在: 如果我想为PrimayStage设置MaxHeight和MaxWidth,我只会得到不需要的结果。 如果我希望我的PrimaryStage具有与Anchorpane相同的最大大小,则窗口要么不显示,要么有滚动条!

如果我把这行放在我的InitWindow mehtod

        // Show the scene containing the layout.
        Scene scene = new Scene(scrollableMainFrame);
        primaryStage.setScene(scene);
        // set max window size
        primaryStage.setMaxHeight(scrollableMainFrame.getHeight());
        primaryStage.show();
什么都不会出现,显然是 'scrollableMainFrame' 在那一点上没有高度。

如果我将setMaxHeight()放在最后,比如

    primaryStage.setScene(scene);
    primaryStage.show();
    // set max window size
    primaryStage.setMaxHeight(scrollableMainFrame.getHeight());

然后将有效地设置最大高度,但滚动条会出现并保持可见,即使窗口已满其大小!

有人知道为什么,我怎么能为我的窗口设置最大尺寸,而且总是没有滚动条?

(简单地将数字添加到最大值primaryStage.setMaxHeight(scrollableMainFrame.getHeight() + 15); 根本不做任何事情,滚动条仍在那里!)

1 个答案:

答案 0 :(得分:1)

谢谢,James_D,你引导我找到解决方案!

确实如你所说,滚动条出现,因为PrimaryStage还包含标题栏,我忘记了。 这让我想到:如何根据内容计算窗口的完整大小,将其设置为最大大小?好吧,我不需要!逻辑有些扭曲,但有效: 我只需要询问Primarystage的实际尺寸,并将其设置为最大值。诀窍是,我需要在创建窗口后执行此操作:

        // create the window
        primaryStage.show();
        // set actual size as max
        primaryStage.setMaxHeight(primaryStage.getHeight());
        primaryStage.setMaxWidth(primaryStage.getWidth());