1

我有一个 Javafx 应用程序,它为用户提供了一组工具,每个工具都在一个新阶段开始。我尝试了几个小时,但其中一个阶段从未显示垂直滚动条。因为我永远看不到舞台的下部,所以我也无法访问水平滚动条。当我在 SceneBuilder 中尝试舞台时,舞台占用的空间更少(这也很奇怪,但我现在不关心)我看到水平滚动条,但仍然看不到垂直滚动条。

该阶段由嵌套的 fxml 组成。主要的包含一个带有树视图的拆分窗格。根据 Treeview 中的用户选择,控制器会加载另一个 fxml,它始终是一个包含匹配 ui 的 Scrollpane,并将其放在拆分窗格的另一侧。正是这个 Scrollpane 导致了问题。

显示没有滚动条的舞台的快照

这是开始新阶段的代码:

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

这是控制器中的代码,它将滚动窗格放入拆分窗格的右侧:

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

外部 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>

和拆分窗格:

<?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="&lt;when&gt;" 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="&lt;what&gt;" 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="&lt;why&gt;" 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="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body contenteditable=&quot;true&quot;&gt;&lt;/body&gt;&lt;/html&gt;" 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>

非常感谢任何帮助。先感谢您!

4

1 回答 1

1

尝试将所有 UI 元素嵌套在滚动窗格中。

于 2017-10-22T02:42:42.977 回答