如何从另一个Controller修改标签(查找+更新)?

时间:2012-08-24 09:57:29

标签: javafx-2

我创建了一个tabPane。在每个选项卡下,我已经包含()一个fxml来显示实际的会话用户,使用以下代码:

home-tab.fxml有这一行:

<fx:include fx:id="topTab" source="../top-tab.fxml"/>

top-tab.fxml:

<AnchorPane maxHeight="20.0"  prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="wuendo.client.TopTabController">
   <children>
      <HBox id="hbox_top" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
         <Label id="label_session" prefHeight="20.0" text="SESSION : " />
         <Label fx:id="sessionLabel" prefHeight="20.0" text="" />  
      </HBox>
   </children>
</AnchorPane>

TopTabController.java:

@FXML public Label sessionLabel;

HomeTabController.java:

@FXML private TopTabController topTabController;


@Override
public void initialize(URL url, ResourceBundle rb) {

  URL location = getClass().getResource("../top-tab.fxml");
  FXMLLoader fxmlLoader = new FXMLLoader(location);
  AnchorPane root = null;
  try {
     root = (AnchorPane) fxmlLoader.load();
  }  catch (IOException ex) {
     Logger.getLogger(HomeTabController.class.getName()).log(Level.SEVERE, null, ex);
  }
  topTabController = (TopTabController) fxmlLoader.getController();

  Label txt = (Label) root.lookup("#sessionLabel");
  txt.setText("blabla");

  System.out.println("sessionLabel= " + topTabController.sessionLabel.getText());
}

执行此操作时,控制台会打印“blabla”,但程序中没有修改标签(gui)

如何更新价值,我该怎么做?

谢谢大家

1 个答案:

答案 0 :(得分:2)

在加载home-tab.fxml时,FXMLLoader已经创建了TopTabController。它是场景中渲染的一个。但是,您正在创建/加载TopTabController的另一个实例,该实例未添加到任何场景中。而您正在更改第二个标签的文本。正确的方法是修改已加载的第一个实例,而不是加载其他实例:

@Override
public void initialize(URL url, ResourceBundle rb) {
    topTabController.sessionLabel.setText("Real blabla");
    System.out.println("sessionLabel= " + topTabController.sessionLabel.getText());
}

旁注,您在评论中提供的链接很有用。