如何将对象传递给不同控制器中的ArrayList(java FX)

时间:2019-04-27 15:23:31

标签: javafx fxml

在JAVA FX中,有一个应用程序,其中一个窗口用于创建具有保险的客户,而另一个窗口具有tableView,用于显示有关客户的信息。在tableView窗口中,我还有一个ArrayList。当我关闭注册窗口时,应用程序将客户对象发送到ArrayList。这很好用,但是当我注册另一位客户保险时,ArrayList在输入新对象之前似乎为空。总结一下,看来我的ArrayList一次只能容纳一个对象。


//In the registration controller, this code is called when I close the window and pass the customer object

    FXMLDocumentController controller = loader.getController();
    controller.initForsikredeKunder(passedCustomer);

//---------- In the view tableclass private ArrayList = null;

public void initForsikredeKunder (Kunde customer) { if(kundeListe == null) { kundeListe = new ArrayList<Kunde>(); } this.kundeListe.add(customer); }

为什么ArrayList只容纳一位客户?在我看来,这段代码仅生成一个ArrayList,然后仅应添加客户 当它们传递给方法时。但是,这没有发生

1 个答案:

答案 0 :(得分:0)

您似乎确实有错字,所以我认为private ArrayList = null确实是:

private ArrayList kundeListe = null;

代码看起来不错(我在某些上下文中猜测),尽管有些地方我会改进。它仅在“ kundeListe”为null时创建一个新列表-因此该列表不会消失。因此,如果您第二次调用initForsikredeKunder(),它要做的就是添加第二个“客户”。

基本上,您可以重复调用initForsikredeKunder(),它将正常工作。

我将initForsikredeKunder重命名为“添加”而不是init。实际上,这是一个添加操作,还可以处理后备列表的延迟初始化。

进一步,您可以执行以下操作:

private List<Kunde> kundeListe = new ArrayList<>();

并删除惰性初始化:

public void addKunder (Kunde customer) {
    kundeListe.add(customer);
}

注意:我不是100%理解上面的叙述,所以我可能会误解发生了什么。如果此“对话框/窗口”仅与单个客户一起使用,则您甚至不需要使用列表!

在提供其他信息后进行编辑:

根据您的代码,看起来好像原始对话框没有被重复使用。 “新的FXMLLoader()”部分很好。

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("FXMLDocument.fxml"));
Parent tableViewParent = loader.load();
Scene tableViewScene = new Scene(tableViewParent); //Access the controller and call the method
FXMLDocumentController controller = loader.getController();
controller.initForsikredeKunder(valgtKunde); // having trouble finding what it should say instead of = new FXMLLoader();

因此,如果您的对话框需要多个客户,那么最简单的操作就是通过initForsikredKunder()调用传入多个。

这个怎么样?

public void initForsikredeKunder (Kunde... customer) {
    if(kundeListe == null) {
        kundeListe = new ArrayList<Kunde>();
    }
    for (Kunde cust : customer) {
        this.kundeListe.add(cust);
    }
}

然后将initForsikredeKunder()调用更改为此:

controller.initForsikredeKunder(valgtKunde1, valgtKunde2, valgtKunde3);//Add as many as you need

如果您已经有一长串“ valgtKunde”:

public void initForsikredeKunder (List<Kunde> customers) {
    if(kundeListe == null) {
        kundeListe = new ArrayList<Kunde>();
    }
    this.kundeListe.addAll(customers);
}

...并将列表传递给initForsikredeKunder(customerList);

在较大的上下文中这是一种重要的事情,不幸的是,我想在这里很难传达所有这些内容,因此可能需要根据更广泛的上下文进行一些调整。 (即,您开始使用什么数据以及对话框功能支持什么)