我正在创建标签,我正在为所有这些使用相同的fxml文件。因此,我所包含的所有类型的控件都具有相同的“fx:id”。我用这个:“@ FXML TextField textField”。我怎么能使用第二个标签的TextField,第一个标签的TextField等?
@Controller
public class MascotaTabControllerImpl implements MascotaTabController
{
private AnchorPane anchorPane;
private Tab tab;
private Mascota mascota;
@FXML
private ComboBox<String> comboMascota;
@FXML
private ComboBox<String> comboTamano;
@FXML
private TextField fieldNombreMascota;
@FXML
private RadioButton radioAlergiaSi;
@FXML
private RadioButton radioAlergiaNo;
@FXML
private TextField fieldRaza;
@FXML
private TextField fieldPeso;
@FXML
private ComboBox<String> comboSexo;
@FXML
private ComboBox<String> comboAgresividad;
@FXML
private TextArea areaObservaciones;
@FXML
private Button buttonEditar;
@FXML
private Button buttonCancelar;
@Override
public void inicializacionFxmlFile(TabPane tabPane, Collection<Mascota> mascotas)
{
try
{
for(Mascota mascota : mascotas)
{
anchorPane = new AnchorPane();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/mascotaTab.fxml"));
loader.setController(this);
anchorPane.getChildren().setAll(loader.load());
tab = new Tab();
tab.setContent(anchorPane);
tabPane.getTabs().add(tab);
tab.setText(mascota.getNombre());
fieldNombreMascota.setText(mascota.getNombre());
fieldRaza.setText(mascota.getRaza());
comboSexo.setValue(mascota.getSexo());
fieldPeso.setText(String.valueOf(mascota.getPeso()));
comboTamano.setValue(mascota.getTamano());
comboAgresividad.setValue(mascota.getAgresividad());
areaObservaciones.setText(mascota.getObservaciones());
mascota.setNombre(fieldNombreMascota.getText());
}
tabSelected(tabPane, mascotas);
buttonEditar.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
mascota.setNombre(fieldNombreMascota.getText());
mascota.setRaza(fieldRaza.getText());
mascota.setSexo(comboSexo.getValue());
mascota.setPeso(Float.parseFloat(fieldPeso.getText()));
mascota.setTamano(comboTamano.getValue());
mascota.setAgresividad(comboAgresividad.getValue());
mascota.setObservaciones(areaObservaciones.getText());
clienteService.actualizarMascota(mascota);;
}
});
buttonCancelar.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
return;
}
});
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
}
}
编辑:想象“for”语句运行两次。如何调用第一个选项卡的控件(TextFields,ComboBoxes等)?
例如,当“for”语句第一次运行时“fieldNombreMascota”引用为“id = 110”但是当“for”语句第二次运行时,相同的TextField引用为“id = 113”。那么如何用注释@FXML调用它们呢?
答案 0 :(得分:0)
因为你打电话
loader.setController(this);
循环内部,每次调用loader.load()
时,您将重复使用与正在加载的FXML的控制器相同的对象。这意味着每次执行for
循环时,@FXML
- 注入的字段将被重新定义。因此,通过这样做,您基本上无法访问除循环的最后一次迭代之外的任何FXML字段。
不得致电 loader.setController(this)
。 &#34;标准&#34;组合FXML文件和控制器的方法是在FXML文件的根元素中使用fx:controller
属性,指定类名。每次调用FXMLLoader
时,这将导致loader.load()
创建该类的新实例。如果您试图通过尝试非标准方式解决其他问题,那么您尝试的解决方案并不是正确的方法。
如果您很好地组织代码,FXML会创建一个控制器实例,并且不需要外部访问该控制器。您可能需要某些控制器来访问某种类型的共享数据模型,但这肯定不是实现这一目标的正确方法。