【问题标题】:JavaFx: auto resize TitledPaneJavaFx:自动调整 TitledPane 的大小
【发布时间】:2018-05-04 22:17:43
【问题描述】:

我有两个TitledPanes 在一个垂直方向的SplitPane 视图。我希望当我折叠其中一个时,将另一个调整为Scene 的高度。这是我的.fxml 文件的代码:

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<BorderPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:id="pane"
            fx:controller="stackoverflow.three.Controller">
    <center>
        <SplitPane fx:id="split" orientation="VERTICAL">
            <TitledPane fx:id="first" text="First">
                <TableView>
                    <columns>
                        <TableColumn text="Test"/>
                    </columns>
                </TableView>
            </TitledPane>
            <TitledPane fx:id="second" text="Second">
                <TableView>
                    <columns>
                        <TableColumn text="Test"/>
                    </columns>
                </TableView>
            </TitledPane>
        </SplitPane>
    </center>
</BorderPane>

以下是一些截图: 初始状态: 当第一个折叠时:

如您所见,如果我折叠第一个,则视图底部有一个间隙,但我不想要那个间隙。

我尝试将maxHeight 设置为 Infinity,但随后自动移至第一个无法正常工作... 知道我能做什么吗?

【问题讨论】:

  • 尝试在您的两个 TitledPanes 上设置 VBox.vgrow="always"
  • 但是我有一个SplitPane,我无法更改为VBox,因为我需要“手动”调整大小,它有SplitPane
  • 您可以将 TitledPanes 包装在 SplitPane 内的 VBoxes 中。
  • 是的,但是如果我折叠第一个窗格,第二个窗格不会放大到第一个。
  • 嗯。你是对的,在你的原始代码中它确实放大了一些,但它仍然留下了一个空白,我想知道为什么会这样。稍后我可能会使用它并想出一个真正的答案,但我建议将您的标题窗格包装在不同类型的区域中,看看这会如何改变它们的布局。

标签: java javafx javafx-8 autoresize splitpane


【解决方案1】:
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>

<BorderPane fx:id="pane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="stackoverflow.three.Controller">
    <center>
      <VBox prefHeight="800.0">
         <children>
               <TitledPane fx:id="first" text="First">
                  <content>
                      <TableView prefHeight="2000.0">
                          <columns>
                              <TableColumn text="Test" />
                          </columns>
                      </TableView>
                  </content>
               </TitledPane>
               <TitledPane fx:id="second" text="Second">
                  <content>
                      <TableView prefHeight="2000.0">
                          <columns>
                              <TableColumn text="Test" />
                          </columns>
                      </TableView>
                  </content>
               </TitledPane>
         </children>
      </VBox>
    </center>
</BorderPane>

【讨论】:

  • 正如我在问题中提到的,我尝试为窗格设置一个 maxHeight,但是在我折叠拳头后第二个窗格没有放大到第一个。
  • 但是您正在折叠 TitledPane,我不明白为什么 SplitPane 会调整大小。 SplitPane 是一个不会根据内容改变其大小的容器。那不是它的目的。我能看到你做的唯一一件事就是在折叠动作中你可以调整滚动窗格的大小,以编程方式从代码中调整分隔线的位置。
  • 我不想调整容器的大小(SplitPane)我只想在展开/折叠窗格时摆脱“空白空间”,例如,如果我折叠拳头一个我想要第二个窗格覆盖视图底部的空白区域。当然,当两者都折叠时,在它们之后会有空白空间,但没关系。
  • 我需要类似这里的东西:stackoverflow.com/questions/12510858/titledpane-event,但我仍在尝试如何做到这一点。
  • 稍微更新了fxml,看看,这对你有用吗?
【解决方案2】:

好的,这是B计划:

拥有带有SplitPane的fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>

<BorderPane fx:id="pane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="stackoverflow.three.Controller">
    <center>
      <SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="800.0">
         <items>
               <TitledPane fx:id="first" text="First">
                  <content>
                      <TableView prefHeight="2000.0">
                          <columns>
                              <TableColumn text="Test" />
                          </columns>
                      </TableView>
                  </content>
               </TitledPane>
               <TitledPane fx:id="second" text="Second">
                  <content>
                      <TableView prefHeight="2000.0">
                          <columns>
                              <TableColumn text="Test" />
                          </columns>
                      </TableView>
                  </content>
               </TitledPane>
         </items>
      </SplitPane>
    </center>
</BorderPane>

向两个 TitledPane 对象添加侦听器到它们的 boolean expanded 属性

expanded.addListener(new ChangeListener<Boolean>() {
     @Override
     public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
         resizeSplitPane();
     }
 });

private void resizeSplitPane(){
   // reposition split pane divider here depending on the status of both 
   // TableViews
   if(!tableView1.isExpanded() && tableView2.isExpanded()){
      splitPane.setDividerPosition(0, 0.1);
   }else if(tableView1.isExpanded() && !tableView2.isExpanded()){
      splitPane.setDividerPosition(0, 0.9);
   }else{
      splitPane.setDividerPosition(0, 0.5);
   }
}

【讨论】:

  • 你试过了吗?不知何故,splitPane.setDividerPositions(0.5); 没有将分隔线设置在 SplitPane 的中间。
  • 我现在无法访问我的 IDE,它实际上更像是一个伪代码,但请尝试 setDividerPosition(int dividerIndex, double percent) 根据docs.oracle.com/javase/8/javafx/api/javafx/scene/control/…
  • 我已经通过在 if 之前和 else 中添加 setPrefHeight(-1) 来解决它 setPrefHeight(split.getHeight() /2) 这是最接近的解决方案。我还想念一件事:平滑调整大小:) 现在,如果我展开折叠,所有内容都会立即正确调整大小,因此不会保持平滑展开/折叠。
  • 第一个和第二个if应该倒置,所以第一个是0.1,第二个是0.9
  • 我做了这个修改并添加到 else 这个:pastebin.com/LScXj3EL 现在它正在按我的预期工作。非常感谢。
【解决方案3】:

我遇到了类似的问题,并通过将两个 TitledPanes 的 maxHeight 设置为 MAX_VALUE 来解决它。在我的情况下,不需要侦听器和包装器(vbox,...)。我正在使用 openjfx 11.0.1。

【讨论】:

    【解决方案4】:

    我设法根据这里的答案弄清楚了一些事情:Animate splitpane divider

        titledPane.expandedProperty().addListener((observable, oldValue, newValue) ->
        {
            double target = d1Orig;
            if( !newValue )
            {
                d1Orig = splitPane.getDividers().get(0);
                target = 0.0;
            }
            KeyValue keyValue = new KeyValue(splitPane.getDividers().get(0).positionProperty(), target);
            Timeline timeline = new Timeline(new KeyFrame(Duration.millis(500), keyValue));
            timeline.play();
        });
    

    d1Orig 是一个 double,用于在折叠之前保存原始拆分窗格的位置。

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2018-07-05
      • 2014-08-15
      • 1970-01-01
      相关资源
      最近更新 更多