Tabs JavaFX:将同一节点设置为多个选项卡存在问题

Tabs JavaFX:将同一节点设置为多个选项卡存在问题,tabs,javafx-2,Tabs,Javafx 2,我正在尝试将特定节点设置为选项卡窗格上的多个选项卡。问题在于,当应用程序启动时,只有最后一个选项卡具有节点,但其余选项卡显示为空 我附上代码和一些屏幕截图来解释问题: import javafx.application.Application; import javafx.geometry.Pos; import javafx.geometry.Side; import javafx.scene.Group; import javafx.scene.Scene; import javafx.sc

我正在尝试将特定节点设置为选项卡窗格上的多个选项卡。问题在于,当应用程序启动时,只有最后一个选项卡具有节点,但其余选项卡显示为空

我附上代码和一些屏幕截图来解释问题:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TabExample extends Application
{

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

@Override
public void start(Stage primaryStage)
{
    primaryStage.setTitle("Tabs");
    Group root = new Group();
    Scene scene = new Scene(root, 400, 250, Color.WHITE);

    TabPane tabPane = new TabPane();

    BorderPane borderPane = new BorderPane();

    Text myText = new Text("Hello");

    for (int i = 0; i < 5; i++)
    {
        Tab tab = new Tab();
        tab.setText("Tab"
            + i);
        HBox hbox = new HBox();
        hbox.getChildren().add(new Label("Tab"
            + i));
        hbox.setAlignment(Pos.CENTER);
        tab.setContent(myText);
        tab.setClosable(false);
        tabPane.getTabs().add(tab);
    }
    tabPane.setSide(Side.BOTTOM);

    // bind to take available space
    borderPane.prefHeightProperty().bind(scene.heightProperty());
    borderPane.prefWidthProperty().bind(scene.widthProperty());

    borderPane.setCenter(tabPane);
    root.getChildren().add(borderPane);
    primaryStage.setScene(scene);
    primaryStage.show();
}
}
导入javafx.application.application;
导入javafx.geometry.Pos;
导入javafx.geometry.Side;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.paint.Color;
导入javafx.scene.text.text;
导入javafx.stage.stage;
公共类TabExample扩展了应用程序
{
公共静态void main(字符串[]args)
{
应用程序启动(args);
}
@凌驾
公共无效开始(阶段primaryStage)
{
初级阶段。设置标题(“制表符”);
组根=新组();
场景=新场景(根,400,250,颜色.白色);
TabPane TabPane=新建TabPane();
BorderPane BorderPane=新的BorderPane();
Text myText=新文本(“你好”);
对于(int i=0;i<5;i++)
{
Tab Tab=新选项卡();
tab.setText(“tab”
+一),;
HBox HBox=新的HBox();
hbox.getChildren().add(新标签(“选项卡”)
+(i);;
hbox.设置校准(位置中心);
tab.setContent(myText);
tab.setClosable(false);
tabPane.getTabs().add(tab);
}
tabPane.setSide(侧面、底部);
//绑定以占用可用空间
borderPane.prefHeightProperty().bind(scene.heightProperty());
borderPane.prefWidthProperty().bind(scene.widthProperty());
边框窗格。设置中心(选项卡窗格);
root.getChildren().add(边框窗格);
初级阶段。场景(场景);
primaryStage.show();
}
}


请让我知道我正在做的事情是否有任何错误,或者这是一个已知的错误?

在JavaFX中,每个
节点可以有一(1)个
父节点。请参阅JavaFXAPI中的页面。如果将
节点添加到另一个
父节点
,则
节点
将失去与旧
父节点
的“连接”,这意味着它将无法在旧
父节点
下显示或访问。 在源代码中导致这种情况的方法是
tab.setContent(myText)


要解决您的问题,您必须创建五个不同的(=独立的)对象,并将它们中的每一个设置为恰好一个
TabPane
作为子对象//内容。

在JavaFx中,每个节点在任何时刻都必须有一个父节点,这是您面临的问题。 但是,使用选项卡的onSelectionChanged()事件可以解决一个问题,即使用setContent()将节点设置为此选项卡的子节点,但是请确保检查选项卡是否已更改以防止重复的子错误此处是一个代码段:

Tab currentTab;
Label label = new Label("Hello");
for(int i = 0;i < tabsNumber; i++){
 Tab tab = new Tab();
 currentTab = tab;
 tab.setOnSelectionChanged(new EventHandler<Event>() {
 @Override
    public void handle(Event event) {
       if (currentTab.equals(tab)) {
          currentTab = tab;
          currentTab.setContent(label);
       }
    }
});
tabPane.getTabs().add(tab);
}
Tab当前选项卡;
标签=新标签(“你好”);
对于(int i=0;i
此外,如果您使用的是场景生成器或其他拖放工具,则可以使用控制器类执行相同的操作,只需记住在选项卡真正更改时保持跟踪即可