I have a Javafx application, which provides the user a set of tools, each started in a new Stage. I tried for hours but one of these stages never shows the vertical scrollbar. Since I never can see the lower part of the stage, I have neither access to the horizontal scrollbar. When I try the stage in SceneBuilder the stage takes less space (what is odd as well, but not my concern now) I see the horizontal scrollbar but still not the vertical one.
The stage consist of a nested fxml. The main one contains a Splitpane with a Treeview. Depending on the user selection in the Treeview, the controller loads another fxml, which is always a Scrollpane containing the matching ui and puts that on the other side of the splitpane. It is this Scrollpane which is causing the problem.
Here is the code that starts the new stage:
protected void showEditor(URL url, Window parent) {
FXMLLoader fxmlLoader = new FXMLLoader(url);
fxmlLoader.setControllerFactory(springContext::getBean); // lookup the controller from the spring application context
try {
Parent appNode = fxmlLoader.load();
SystemDependent ctrl = fxmlLoader.getController();
ctrl.setSystemContext(mySelectedSystem);
Scene scene = new Scene(appNode);
Stage stage = new Stage();
ctrl.setStage(stage);
//stage.initOwner(parent);
stage.setScene(scene);
stage.show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
This is the code in the controller which puts the Scrollpane into the right side of the Splitpane:
protected ChangeListener<TreeItem<UserRequirement>> getRequirementSelectionChangeListener() {
return new ChangeListener<TreeItem<UserRequirement>>() {
@Override
public void changed(ObservableValue<? extends TreeItem<UserRequirement>> observable, TreeItem<UserRequirement> oldValue, TreeItem<UserRequirement> newValue) {
logger.debug("User selected requirement: " + newValue.getValue().debug());
UserRequirement oldRequirement = newValue.getValue();
reqService.save(oldRequirement);
UserRequirement newRequirement = newValue.getValue();
try {
if(currentLevel != newRequirement.getLevel()) {
currentLevel = newRequirement.getLevel();
RequirementsFactory factory = RequirementFactoryProducer.getRequirementFactory(newRequirement.getLevel());
ScrollPane reqPane = factory.getHierarchyPane();
splitPane.getItems().add(reqPane);
ctrl = factory.getHierarchyController();
}
ctrl.setSystemContext(getSelectedProduct());
ctrl.setRequirement(newRequirement);
stage.sizeToScene();
stage.centerOnScreen();
splitPane.setDividerPosition(0, 0.1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
The outer fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TreeView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<BorderPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" stylesheets="@../stylesheets/controller.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.agiletunes.controllers.requirement.RequirementEditorCtrl">
<top>
<HBox alignment="BOTTOM_LEFT" maxWidth="1.7976931348623157E308" nodeOrientation="LEFT_TO_RIGHT" BorderPane.alignment="BOTTOM_LEFT">
<children>
<Label styleClass="tool" text="Header">
</Label>
<Label styleClass="editor" text="header">
</Label>
</children>
<BorderPane.margin>
<Insets bottom="10.0" left="20.0" right="20.0" top="20.0" />
</BorderPane.margin>
</HBox>
</top>
<center>
<SplitPane fx:id="splitPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" BorderPane.alignment="CENTER">
<items>
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" styleClass="pane">
<children>
<ScrollPane fitToHeight="true" fitToWidth="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" AnchorPane.bottomAnchor="20.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
<content>
<TreeView fx:id="requirementsTreeView" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" />
</content>
</ScrollPane>
</children>
</AnchorPane>
</items>
<BorderPane.margin>
<Insets />
</BorderPane.margin>
</SplitPane>
</center>
</BorderPane>
and the Splitpane:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Pagination?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Tooltip?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.web.HTMLEditor?>
<ScrollPane fitToHeight="true" fitToWidth="true" pannable="true" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.agiletunes.controllers.requirement.UserStoryEditorCtrl">
<content>
<GridPane fx:id="gridPane" hgap="10.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" styleClass="pane" stylesheets="@../stylesheets/controller.css" vgap="10.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="20.0" percentWidth="9.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="7.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="7.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="80.0" percentWidth="7.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="7.0" />
<ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints fillHeight="false" minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints fillHeight="false" vgrow="NEVER" />
<RowConstraints maxHeight="1.7976931348623157E308" minHeight="50.0" prefHeight="100.0" vgrow="ALWAYS" />
<RowConstraints fillHeight="false" vgrow="SOMETIMES" />
<RowConstraints fillHeight="false" vgrow="SOMETIMES" />
<RowConstraints maxHeight="1.7976931348623157E308" vgrow="ALWAYS" />
</rowConstraints>
<children>
<HBox alignment="BOTTOM_LEFT" maxWidth="1.7976931348623157E308" nodeOrientation="LEFT_TO_RIGHT" GridPane.columnSpan="9" GridPane.valignment="BOTTOM">
<GridPane.margin>
<Insets bottom="10.0" left="15.0" />
</GridPane.margin>
<children>
<Label styleClass="tool2" text="Header">
<font>
<Font name="System Bold" size="28.0" />
</font>
</Label>
</children>
</HBox>
<ComboBox fx:id="personaComboBox" maxWidth="1.7976931348623157E308" promptText="- select -" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.valignment="TOP">
<GridPane.margin>
<Insets left="20.0" right="5.0" />
</GridPane.margin>
</ComboBox>
<Label text="Label" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
<padding>
<Insets left="10.0" />
</padding>
<GridPane.margin>
<Insets left="20.0" />
</GridPane.margin>
<font>
<Font name="System Bold" size="15.0" />
</font>
</Label>
<Label text="label" GridPane.columnIndex="2" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
<GridPane.margin>
<Insets left="5.0" />
</GridPane.margin>
<font>
<Font name="System Bold" size="15.0" />
</font>
</Label>
<Label text="label" GridPane.columnIndex="5" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
<GridPane.margin>
<Insets left="5.0" />
</GridPane.margin>
<font>
<Font name="System Bold" size="15.0" />
</font>
</Label>
<Label text="label" GridPane.columnIndex="7" GridPane.columnSpan="2" GridPane.rowIndex="1" GridPane.valignment="BOTTOM">
<GridPane.margin>
<Insets left="5.0" />
</GridPane.margin>
<font>
<Font name="System Bold" size="15.0" />
</font>
</Label>
<TextArea fx:id="triggerTextArea" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" promptText="<when>" wrapText="true" GridPane.columnIndex="2" GridPane.columnSpan="3" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.vgrow="ALWAYS">
<GridPane.margin>
<Insets />
</GridPane.margin>
</TextArea>
<TextArea fx:id="featureTextArea" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" promptText="<what>" wrapText="true" GridPane.columnIndex="5" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.vgrow="ALWAYS">
<GridPane.margin>
<Insets />
</GridPane.margin>
</TextArea>
<TextArea fx:id="resultTextArea" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" promptText="<why>" wrapText="true" GridPane.columnIndex="7" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" GridPane.vgrow="ALWAYS">
<GridPane.margin>
<Insets right="12.0" />
</GridPane.margin>
</TextArea>
<Label text="label" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="30.0" right="10.0" />
</GridPane.margin>
</Label>
<Button fx:id="newVersionButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#createNewVersion" text="New" GridPane.columnIndex="4" GridPane.halignment="LEFT" GridPane.hgrow="SOMETIMES" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Button>
<Label text="label" GridPane.columnIndex="5" GridPane.halignment="LEFT" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<ComboBox fx:id="statusComboBox" maxWidth="1.7976931348623157E308" onAction="#handleStatusChange" onContextMenuRequested="#showStatusHistory" promptText="- select -" GridPane.columnIndex="6" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4">
<GridPane.margin>
<Insets />
</GridPane.margin>
</ComboBox>
<Label text="label" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="30.0" right="10.0" />
</GridPane.margin>
</Label>
<TextField fx:id="rankTextField" editable="false" maxWidth="1.7976931348623157E308" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3">
<GridPane.margin>
<Insets right="10.0" />
</GridPane.margin>
</TextField>
<Label text="label" GridPane.columnIndex="2" GridPane.halignment="LEFT" GridPane.rowIndex="4">
<GridPane.margin>
<Insets right="10.0" />
</GridPane.margin>
</Label>
<TextField fx:id="creationDateTextField" editable="false" maxWidth="1.7976931348623157E308" GridPane.columnIndex="3" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4" />
<TextField fx:id="authorTextField" editable="false" maxWidth="1.7976931348623157E308" GridPane.columnIndex="8" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4">
<GridPane.margin>
<Insets right="12.0" />
</GridPane.margin>
</TextField>
<Label text="label" GridPane.columnIndex="7" GridPane.halignment="LEFT" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<ComboBox fx:id="myVersionComboBox" maxWidth="1.7976931348623157E308" onAction="#versionSelection" promptText="- select -" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4">
<GridPane.margin>
<Insets right="10.0" />
</GridPane.margin>
</ComboBox>
<Label text="label" GridPane.columnIndex="5" GridPane.halignment="LEFT" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<ComboBox fx:id="prioComboBox" maxWidth="1.7976931348623157E308" promptText="- select -" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
<Label text="label" GridPane.columnIndex="2" GridPane.halignment="LEFT" GridPane.rowIndex="3">
<GridPane.margin>
<Insets right="10.0" />
</GridPane.margin>
</Label>
<TabPane fx:id="tabPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" tabClosingPolicy="UNAVAILABLE" GridPane.columnSpan="2147483647" GridPane.hgrow="ALWAYS" GridPane.rowIndex="5" GridPane.vgrow="ALWAYS">
<tabs>
<Tab text="Tab 1">
<content>
<fx:include fx:id="embeddedAcceptanceCriteria" source="AcceptanceCriteriaEditorPane.fxml" />
</content>
</Tab>
<Tab text="Tab 2">
<content>
<fx:include fx:id="embeddedEffortEstimate" source="EffortEstimationEditorPane.fxml " />
</content>
</Tab>
<Tab text="Tab 3">
<content>
<Pagination fx:id="pagination" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" pageCount="0" />
</content>
</Tab>
<Tab text="Description">
<content>
<HTMLEditor fx:id="descriptionTextArea" htmlText="<html><head></head><body contenteditable="true"></body></html>" onKeyReleased="#keyReleased" prefHeight="200.0" prefWidth="506.0" />
</content>
</Tab>
<Tab text="Tab 5">
<content>
</content>
</Tab>
<Tab text="Tab 6">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
<GridPane.margin>
<Insets bottom="20.0" left="12.0" right="12.0" />
</GridPane.margin>
</TabPane>
<TextField fx:id="releaseTextField" editable="false" GridPane.columnIndex="6" GridPane.rowIndex="3" />
<Label text="Label" GridPane.columnIndex="7" GridPane.halignment="LEFT" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<TextField fx:id="iterationTextField" editable="false" GridPane.columnIndex="8" GridPane.rowIndex="3">
<GridPane.margin>
<Insets right="12.0" />
</GridPane.margin>
</TextField>
</children>
<padding>
<Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
</padding>
</GridPane>
</content>
</ScrollPane>
Any help is highly appreciated. Thank you in advance!