我在 fxml 文件中存储了 Pane 组件。我将此组件导入另一个场景,我希望此组件显示自动生成的信息。所以我搜索了这个确切的问题,我发现了这个:Passing parameters to a controller when loading an FXML。他们这样做:
private void addReservation(Reservation r) {
try {
FXMLLoader fxmloader = new FXMLLoader(getClass().getResource("/views/item_reserva.fxml"));
Pane client = (Pane) fxmloader.load();
Item_reservaController controller = fxmloader.<Item_reservaController>getController();
controller.init(r);
flowPane.getChildren().add(client);
} catch (IOException ex) {
ex.printStackTrace();
}
}
我将组件加载到 Parent 类型,在这种情况下 Pane 。然后我调用它的控制器并初始化组件,最后在 Flowpane 中显示 Pane 。
这是init方法的作用:
public void init(Reservation r) {
this.reservation = r;
labelCountry = new Label(r.getClients().getFirst().getCountry());
labelRoom = new Label(Integer.toString(r.getRooms().size()));
labelClient = new Label(Integer.toString(r.getClients().size()));
}
我猜这个问题与我绘制的对象与我改变的控制器不同有关,所以它不会改变真实组件内的信息。
答案 0 :(得分:1)
由于在加载fxml后调用了init
方法,因此在该方法中创建的Label
不太可能被添加到场景中。
并且fxml文件中没有定义标签。
由于场景已包含相应的Label
,因此请使用这些Label
而不是创建新的Label
。如果setText
已成功注入控制器,只需使用public void init(Reservation r) {
this.reservation = r;
labelCountry.setText(r.getClients().getFirst().getCountry());
labelRoom.setText(Integer.toString(r.getRooms().size()));
labelClient.setText(Integer.toString(r.getClients().size()));
}
分配内容:
while (<>){
my ($let, $start, $stop, $num) = split;
if ( defined($oldLet) ){
if ($let eq $oldLet and $start == $oldStart and $stop == $oldStop) {
print $chr,"\t",$start,"\t",$stop,"\t",$num + $oldNum, "\n";
}
}
my $oldLet = $let;
my $oldStart = $start;
my $oldStop = $stop;
my $oldNum = $num;
}