2017-10-21 127 views
0

我有一個Javafx應用程序,它爲用戶提供了一組工具,每個工具都在一個新的Stage中啓動。我嘗試了幾個小時,但其中一個階段從不顯示垂直滾動條。由於我永遠無法看到舞臺的下半部分,因此我無法訪問水平滾動條。當我在SceneBuilder中嘗試舞臺時,舞臺佔用的空間更少(也有些奇怪,但現在我不擔心)我看到水平滾動條,但仍然不是垂直滾動條。Javafx stage不顯示V-Scrollbar

階段包含一個嵌套的fxml。主要包含一個帶有Treeview的Splitpane。根據樹形視圖中的用戶選擇,控制器加載另一個fxml,該fxml始終是一個包含匹配ui的Scrollpane,並將其放在分離面板的另一側。正是這個Scrollpane導致了這個問題。

snapshot showing the stage w/o scrollbars

這裏是啓動新的階段的代碼:

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

這是在控制器這使滾動窗格成在將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(); 
      } 
     } 
    }; 
} 

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

,並在將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="&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> 

任何幫助,高度讚賞。先謝謝你!

回答

1

嘗試嵌套滾動窗格中的所有UI元素。

+0

你是什麼意思?右側的所有元素都已經在ScrollPane中。將外部BorderPane對話框放置在ScrollPane中會導致一種不同的ui易用性,這會是奇怪的。或者這個測試會提供一個有助於確定根本原因的內容? – Alex

+0

無論如何我都試過了。沒有不同。這讓我覺得有些更基本的錯誤。所以我把BorderPane改成了VBox。瞧,我可以看到較低的滾動條。雖然現在好一些,但我還有一個問題:右側窗格仍然缺少垂直滾動窗格,右側Splitpane部分的標題的大部分上半部分缺失。 – Alex