使用 ActionListener 检查特定实例,然后将其添加到 ArrayList

Using an ActionListener to check for a specific instance from and then add to an ArrayList

我创建了一个接受以下字段(名称、街道、城市、州、邮政编码、帐号)的 GUI。此外,您还可以从面板中选择 3 种客户类型,最后从下拉课程组合框中选择课程。

当用户输入以上信息并点击“SUBMIT”时,如果客户不存在,程序会创建客户并将其放入客户列表中,在课程列表中找到所选课程并询问用户是否希望通过确认弹出对话框注册课程。如果用户选择“是”,该课程将添加到该客户的课程列表中,清除字段,将光标置于名称字段中,然后可以进行其他输入。如果客户已经退出,则不会创建新客户,但会将课程添加到该客户的课程列表中。 当用户单击“FINISH”时,程序将提示写入每个客户及其课程列表,显示发票对话框,然后退出。 使用匿名 actionListeners。我需要 clearFieldsaddCourse 接受客户名称和课程标题的方法,addCustomer 使用字段中的数据创建客户并将其添加到客户列表, readCourses 读取 courses.txt,创建课程并将它们添加到课程列表,并填充用于下拉框选择的字符串数组,以及 generateInvoice。这是我所知道的。

submitButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
          if (confirm())
    {
                customerList.add(new Customer(nameField.getText(),new Address(streetField.getText(), cityField.getText(), stateField.getText(), Integer.parseInt(zipField.getText())), Integer.parseInt(accountNumberField.getText())));
            }

    clearFields();            
        }
    });

    finishButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent ae) 
        {
            for(Customer c: customerList)
                System.out.println(c.toString());

            System.exit(0);
        }
    });

    add(nameLabel);
    add(nameField);  
    add(streetLabel);
    add(streetField);
    add(cityLabel);
    add(cityField);  
    add(stateLabel);
    add(stateField);
    add(zipLabel);
    add(zipField); 
    add(accountNumberLabel);
    add(accountNumberField);

    add(customerLabel);
    add(myPanel);

    add(courseLabel);
    add(courseBox);

    add(submitLabel);
    add(submitButton);

    add(finishLabel);
    add(finishButton);
}   

public static void main(String args[])
{
    CourseGUI g = new CourseGUI();

    g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    g.setLocationRelativeTo(null);

    g.setSize(650,350);

    g.setVisible(true);
}   

public void clearFields()
{
    nameField.setText("");
    streetField.setText("");
    cityField.setText("");
    stateField.setText("");
    zipField.setText("");
    accountNumberField.setText("");
    myGroup.clearSelection();
courseBox.setSelectedIndex(0);

nameField.requestFocus();
}

public String getCourse()
{
   return courses[courseBox.getSelectedIndex()];        
}

public String getClassification()
{
if (studentButton.isSelected())
return studentButton.getText();
else if (facultyButton.isSelected())
return facultyButton.getText();
else 
return governmentButton.getText();
}

public boolean confirm()
{
JFrame frame = new JFrame();

int result;

String message;

message = String.format("%s %s %s %s %s %d %d", nameField.getText(), streetField.getText(), cityField.getText(), stateField.getText(), zipField.getText(), accountNumberField.getText());

result = JOptionPane.showConfirmDialog(frame, message);

if (result == JOptionPane.YES_OPTION)
        return true;
return false;
}

我需要帮助的是我的 submitButton 中的编码。添加动作监听器。我将如何检查客户是否已经存在,如果不存在则将其添加到 customerList。 假设所有其他 类 和所需的 arrayList 已经创建。

在您的 Customer class 中实施 equals() 方法,比较您认为应该确定两个客户是否重复的所有字段。例如,以下仅比较 帐号 (并假设它们永远不会是 null):

@Override
public boolean equals(Object obj) {
    if (obj instanceof Customer) {
        Customer other = (Customer) obj;
        return this.getAcNumber().equals(other.getAcNumber());
    }
    return false;
}

然后您可以使用 indexOf() 确定 Customer 是否已经存在于 List 中。 List 实现会自动使用我们上面的 equals() 方法进行比较。

if (confirm()) {
    Customer new = new Customer(nameField.getText(),new Address(streetField.getText(),
    cityField.getText(), stateField.getText(), Integer.parseInt(zipField.getText())),
    Integer.parseInt(accountNumberField.getText()));

    int existing = -1;
    if ((existing = customerList.indexOf(new)) != -1) {
        Customer old = customerList.get(existing);
        // Add course to existing customer
    } else {
        customerList.add(new);
    }
}

我假设您会在 Customer class 中为 课程 添加另一个 List,以便您可以添加多个 课程现有客户

可爱的 ArrayList 有一个 "contains" 方法,而且确实如此。有关 ArrayLists 的更多信息。

if(!customerList.contains(new Customer(nameField.getText()))
{
  customerList.add(new Customer(nameField.getText(),new Address(streetField.getText(), cityField.getText(), stateField.getText(), Integer.parseInt(zipField.getText())), Integer.parseInt(accountNumberField.getText())));
}

为了获得完整的功能,您应该定义 Customer 和 Address 对象如何相互相等。执行此操作的最佳方法是覆盖 equals() 和 hashcode() 函数这是一个示例对于客户,您可以将模式应用于地址对象:

public class Customer {

    private String name;
    private Address address;
    private String accountNumber;

    public Customer(String name, Address address, String accountNumber) {
        // your put constructor code
    }

    // put your getting and setting methods here

    @Override
    public boolean equals(Object obj) {
        if (this == obj)  
            return true;  
        if (obj == null)  
            return false;  
        if (getClass() != obj.getClass())  
            return false;  

        Customer otherCustomer = (Customer) obj;  

        // define how the names equals
        if (this.name == null) {  

            if (otherCustomer.getName() != null) {  
                return false;
            }

        } else if (!this.name.equals(otherCustomer.getName())) {
            return false;
        }

        // define how the accountNumber equals
        if (this.accountNumber == null) {  

            if (otherCustomer.getAccountNumber() != null) {  
                return false;
            }

        } else if (!this.accountNumber.equals(otherCustomer.getAccountNumber())) {
            return false;
        }

        //define how the Address equals
        if (this.address == null) {  

            if (otherCustomer.getAddress() != null) {  
                return false;
            }

        } else if (this.address.equals(otherCustomer.getAddress())) {
            return true;
        } else {
            return  false;
        }

        return true;

    };

    @Override
    public int hashCode() {
         final int prime = 31;  

            int result = 1;  
            result = prime * result 
                    + ((name == null) ? 0 : name.hashCode()) 
                    + ((accountNumber == null) ? 0 : accountNumber.hashCode())
                    + ((address.getCityField() == null) ? 0 : address.getCityField() .hashCode()) 
                    + ((address.getStateField() == null) ? 0 : address.getStateField() .hashCode())
                    + ((address.getStreetField() == null) ? 0 : address.getStreetField() .hashCode())
                    + address.getZipField();

            return result;  

    }
 }

然后在您的 addActionListener() 函数中检查您的客户是否已经存在:

Customer newCustomer = new Customer(nameField.getText(),new Address(streetField.getText(), cityField.getText(), stateField.getText(), Integer.parseInt(zipField.getText())), Integer.parseInt(accountNumberField.getText())));

    if (!customerList.contains(newCustomer)) {
        customerList.add(newCustomer)
    }