如何使所有JFrame可以访问ArrayList以及如何更新它?

时间:2017-03-16 03:30:25

标签: java user-interface arraylist netbeans jbutton

所以我正在制作一个模拟星巴克应用程序,我希望每次客户点击“订单”按钮时,产品都会添加到ArrayList中,并且所有人都可以访问此ArrayList。我有点困惑在哪里插入全局ArrayList代码...

这是我的btnOrder的代码:

private void btnOrderActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String name = lblName.getText();
    String size = cmbSize.getSelectedItem().toString();
    int quantity = (int) spnrQuantity.getValue();
    int price=0;

    if (size.equals("Tall 12oz")) {
        price = 170;
    } else if (size.equals("Grande 16oz")) {
        price = 180;
    } else if (size.equals("Venti 20oz")) {
        price = 190;
    }

    Global.list.add(new Object());
    new Receipt(name, size, quantity, price).setVisible(true);
}

这是我的Receipt框架的代码,其中包含JTable,因此我可以显示订单:

public class Receipt extends javax.swing.JFrame {

/**
 * Creates new form Receipt
 */
public Receipt() {
    initComponents();
}

String size, name;
int quantity, price;

public Receipt(String name, String size, int quantity, int price) {
    initComponents();

    this.name = name;
    this.size = size;
    this.quantity = quantity;
    this.price = price;

    addToTable();
}

void addToTable() {
    DefaultTableModel table = (DefaultTableModel) tblCart.getModel();

    Vector v = new Vector();

    v.add(name);
    v.add(size);
    v.add(price);
    v.add(quantity);

    table.addRow(v);
}

这是可访问的ArrayList的代码:

public class Global {
    public static ArrayList<Object> list = new ArrayList<>();

    private Global(){

    }
}

2 个答案:

答案 0 :(得分:1)

管理全局状态可能是一场噩梦,而您可以使用单身人士来解决问题,但这违反了Single responsibility principle。它还删除了访问控制,允许任何人以他们认为合适的方式修改列表而无需控制。

另一个解决方案是使用某种模型,它可以在各个组件之间传递,如果你巧妙地使用interface,你可以控制谁可以做什么以及何时做。

这是Model-View-Controllerprogram to interface not implementation原则的核心概念。

基本的想法是你会创建一个&#34;模型&#34;维护您要共享的数据,主要是客户订单中的项目(可能是客户的名称)

您可以创建一个合适的订单并将其引用传递给&#34; order&#34;视图,它可以在模型中添加/删除/更新项目。完成后,&#34;控制器&#34;然后将相同的模型实例传递给&#34;签出&#34; view,将使用此信息生成帐单(可能还有付款信息),最后存储交易

然后,您可以在最后获取模型中的信息并告知发生了什么。

由于您可能需要控制复杂状态,因此您可能需要多个模型,例如,您可以传递&#34;命令&#34;模拟到&#34;退房&#34;查看,但它可以创建一个&#34;事务&#34;模型,包装&#34;命令&#34;模型

答案 1 :(得分:0)

您可以在此处使用Singleton设计模式。使用单身人士,您可以利用静态对象无法实现的Polymorphism

enum Global {
    INSTANCE;

    private ArrayList<Object> list = new ArrayList<>();

    public void add(Object obj) {
        //custom validations (if any)
        list.add(obj);
    }

    public Object get(int index) {
        //check here for permissions, validations etc...
        return list.get(index);
    }

    //other methods to access your shared objects
    ...
}

在此示例中,使用ENUM实现单例模式,以确保线程安全。您还可以使用The ‘Inner Class’ Approach实现单例,这也是线程安全的。

<强>用法

private void btnOrderActionPerformed(java.awt.event.ActionEvent evt) {                                         

    ...

    Global.INSTANCE.add(new Object());
    new Receipt(name, size, quantity, price).setVisible(true);
}

Difference between static class and singleton pattern?