JavaFx:自动调整 TitledPane 的大小
JavaFx: auto resize TitledPane
我有一个视图,其中两个 TitledPane
垂直放置在 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="Whosebug.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,但是自动向上移动到第一个的功能不起作用...
ide 我能做什么?
<?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="Whosebug.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>
好的,这是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="Whosebug.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);
}
}
我遇到了类似的问题,通过将两个 TitledPanes 的 maxHeight 设置为 MAX_VALUE 解决了这个问题。在我的例子中,不需要监听器和包装器(vbox,...)。我正在使用 openjfx 11.0.1.
我根据这里的答案想出了一些办法:
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,用于保存折叠前的原始拆分窗格位置。
我有一个视图,其中两个 TitledPane
垂直放置在 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="Whosebug.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,但是自动向上移动到第一个的功能不起作用...
ide 我能做什么?
<?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="Whosebug.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>
好的,这是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="Whosebug.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);
}
}
我遇到了类似的问题,通过将两个 TitledPanes 的 maxHeight 设置为 MAX_VALUE 解决了这个问题。在我的例子中,不需要监听器和包装器(vbox,...)。我正在使用 openjfx 11.0.1.
我根据这里的答案想出了一些办法:
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,用于保存折叠前的原始拆分窗格位置。