gpt4 book ai didi

JavaFX TabPane 和调整父舞台的大小

转载 作者:行者123 更新时间:2023-12-04 21:13:12 28 4
gpt4 key购买 nike

我有一个带有可变复选框列表的阶段。当列表更改时,舞台必须调整大小。这在大多数情况下都可以正常工作,在将所有复选框添加到 VBox 之后,您然后调用 stage.sizeToScene() 并且舞台相应地调整大小。但是,如果您将所有这些放在 TabPane 中的 Tab 中, stage.sizeToScene() 将不再起作用。我有点不明白为什么会这样。有没有人有好的解决方法或解决方案?

一些示例代码如下。只需将 withTabs 字段更改为 false 或 true,即可显示没有和有 TabPane 的情况。

谢谢您的帮助。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TabResizeError extends Application {

boolean withTabs=false;

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) {

primaryStage.setTitle("Hello World!");


//holds variable number of check boxes
VBox channelBox=new VBox();
channelBox.setSpacing(5);

//create controls
HBox controlsHBox=new HBox();
controlsHBox.setSpacing(5);

Button btn = new Button();
btn.setText("Resize Test");

ComboBox<Integer> comboBox=new ComboBox<Integer>();
ObservableList<Integer> number=FXCollections.observableArrayList();
for (int i=0; i<32; i++){
number.add(i);
}
comboBox.setItems(number);
comboBox.getSelectionModel().select(5);

controlsHBox.getChildren().addAll(btn, comboBox);

btn.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent event) {
//remove all check boxes
channelBox.getChildren().removeAll(channelBox.getChildren());
//add new check boxes
for (int i=0; i<comboBox.getSelectionModel().getSelectedItem(); i++){
CheckBox checkBox=new CheckBox(("Channel "+i));
channelBox.getChildren().add(checkBox);
}
primaryStage.sizeToScene();
}
});

Pane root=null;

VBox mainPane = new VBox();
mainPane.getChildren().addAll(controlsHBox,channelBox);
mainPane.setSpacing(5);
if (withTabs){
TabPane tabbedPane=new TabPane();
Tab tab=new Tab("TestTab");
tab.setContent(mainPane);
tabbedPane.getTabs().add(tab);
root=new BorderPane(tabbedPane);
}
else{
root = mainPane;
}
// root.setTop(controlsHBox);
// root.setCenter(channelBox);

primaryStage.setScene(new Scene(root));
primaryStage.setMinHeight(300);
primaryStage.show();
}

}

最佳答案

这是我找到的一些信息。请记住,我仍然是一个相当业余的程序员。

我复制了您的代码并试图找到有关如何解决此问题的解决方案。

正如我所注意到的,tabpane 发生了一些奇怪的事情 - 选项卡的内容会突然变成白色,返回边界的方法将始终返回相同的值,而 sizeToSceneMethod() 只是这样做 - 设置宽度和舞台的高度取决于里面的东西。

现在在注意到奇怪的事情后,我通过谷歌挖掘到 find this bug submission ,它说它仍然没有解决几年。

在那里我找到了一个有效的代码片段,但它有这个问题 - 每次都删除并添加选项卡,您可以直观地看到这一点

private static final void changeTabPaneSize(final TabPane tabPane) { 
final int index = tabPane.getSelectionModel().getSelectedIndex();
if (index < 0 || tabPane.getTabs().isEmpty()) {
return;
}

if (tabPane.getTabs().size() == 1) {
final Tab tab = tabPane.getTabs().remove(0);
tabPane.getTabs().add(tab);
} else if (tabPane.getTabs().size() > 1 && index == 0) {
tabPane.getSelectionModel().select(1);
} else if (tabPane.getTabs().size() > 1 && index != 0) {
tabPane.getSelectionModel().select(1);
}

tabPane.getSelectionModel().select(index);
}

使用此方法然后调用 sizeToScene 确实有效:
changeTabPaneSize(tabbedPane);
primaryStage.sizeToScene();//method called after resetting the tab

除此之外,你最好的办法是手动设置舞台大小,即使这种气味,虽然它有效:
primaryStage.sizeToScene();
double constantFoundByTrialAndError = 70;
primaryStage.setHeight(mainPane.getHeight()+constantFoundByTrialAndError);

编辑:我现在注意到我回答了一个 2 年前的问题。

关于JavaFX TabPane 和调整父舞台的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com