如何在dinamically创建选项卡时调用多个控件

时间:2015-08-21 12:40:09

标签: javafx fxml

我正在创建标签,我正在为所有这些使用相同的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调用它们呢?

1 个答案:

答案 0 :(得分:0)

因为你打电话

loader.setController(this);
循环内部,每次调用loader.load()时,您将重复使用与正在加载的FXML的控制器相同的对象。这意味着每次执行for循环时,@FXML - 注入的字段将被重新定义。因此,通过这样做,您基本上无法访问除循环的最后一次迭代之外的任何FXML字段。

不得致电 loader.setController(this)。 &#34;标准&#34;组合FXML文件和控制器的方法是在FXML文件的根元素中使用fx:controller属性,指定类名。每次调用FXMLLoader时,这将导致loader.load()创建该类的新实例。如果您试图通过尝试非标准方式解决其他问题,那么您尝试的解决方案并不是正确的方法。

如果您很好地组织代码,FXML会创建一个控制器实例,并且不需要外部访问该控制器。您可能需要某些控制器来访问某种类型的共享数据模型,但这肯定不是实现这一目标的正确方法。