我正在尝试构建单个窗口应用程序以更好地了解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);
根本不做任何事情,滚动条仍在那里!)
答案 0 :(得分:1)
谢谢,James_D,你引导我找到解决方案!
确实如你所说,滚动条出现,因为PrimaryStage还包含标题栏,我忘记了。 这让我想到:如何根据内容计算窗口的完整大小,将其设置为最大大小?好吧,我不需要!逻辑有些扭曲,但有效: 我只需要询问Primarystage的实际尺寸,并将其设置为最大值。诀窍是,我需要在创建窗口后执行此操作:
// create the window
primaryStage.show();
// set actual size as max
primaryStage.setMaxHeight(primaryStage.getHeight());
primaryStage.setMaxWidth(primaryStage.getWidth());