Java ArrayList“忘记”一切

时间:2014-04-02 18:44:14

标签: java arraylist

我有一个程序将数据添加到ArrayList。然后从主菜单中按下一个按钮,它会显示整个ArrayList。问题是,当我填写表单时,它将添加到ArrayList,但是当你转到主菜单时,它会忘记ArrayList中的所有内容并显示为空。

我知道我需要设置一些东西(我以前做过一次),但我无法理解。

这是主菜单:

import java.awt.EventQueue;

public class KlantenbindingFrame extends JFrame implements ActionListener {
/**
private static final long serialVersionUID = 1L;
JFrame frame;
private JButton toonKlanten, toonAutos, toonOverzicht, voegKlantToe,
private JPanel contentPane;
private Klantenbinding klantenBindingRef;
private Klant klantRef;
 * Launch the application.
public static void main(String[] args) {

 * Create the frame.
public KlantenbindingFrame() {

public void actionPerformed(ActionEvent e) {
//      klantenBindingRef = new Klantenbinding();
    if (e.getSource() == voegKlantToe) {
        KlantToevoegen vkt = new KlantToevoegen();
//          vkt.setKlantenBindingRef(klantenBindingRef);
        vkt.setVisible(true);
//          setVisible(false);
    }

    if (e.getSource() == toonOverzicht) {
        System.out.println(klantenBindingRef.toString());
        JOptionPane.showMessageDialog(null,
                klantenBindingRef.toString(),
                "Alle klanten", JOptionPane.INFORMATION_MESSAGE);

    }

}

public void setKlantenBindingRef(Klantenbinding klantenBindingRef) {
    this.klantenBindingRef = klantenBindingRef;

}

public void setKlantRef(Klant klantref) {
    this.klantRef = klantref;
}

public void setDeKlant(Klant klantref){
    this.klantRef = klantref;
}

}

这是存储ArrayList的类:

import java.util.ArrayList;
import java.util.List;


public class Klantenbinding {
private String naam;
protected List<Klant> alleKlanten = new ArrayList<Klant> ();

public void voegKlantToe(Klant k){
    if (alleKlanten.indexOf(k) == -1){
        alleKlanten.add(k);
    }
}

public List<Klant> getAlleKlanten(){
    return alleKlanten;
}

public void setAlleKlanten(ArrayList<Klant> alleKlanten) {
    this.alleKlanten = alleKlanten;
}

public boolean heeftKlant(String naam) {
    boolean b = false;
    for (Klant k : alleKlanten) {
        if (k.getNaam() == naam) {
            b = true;
        }
    }
    return b;
}

public void verwijderKlant(Klant exKlant) {
    if (heeftKlant(exKlant.getNaam())) {
        alleKlanten.remove(exKlant);
    }
}

public boolean zoekKlant(Klant nweKlant) {
    for (Klant k : alleKlanten) {
        if (k.equals(nweKlant)) {
            return true;
        }
    }
    return false;
}

public Klant zoekKlant(String naam) {
    Klant antw = null;
    for (Klant k : alleKlanten){
        if (k.getNaam() == naam){
            antw = k;
        }
    }
    return antw;
}

public void verwijderKlant (String naam){
    Klant gezochte = zoekKlant(naam);
    if (gezochte != null){
        alleKlanten.remove(gezochte);
    }
}

public int aantalKlanten() {
    return alleKlanten.size();
}

public String getNaam(){
    return naam;
}

public String toString() {
    String s = "ATD heeft " + aantalKlanten() + " klant(en). \n\n";
    for (Klant k : alleKlanten) {
        s += k + "\n";
    }
    return s;
}
}

这是我将客户添加到ArrayList的类:

import java.awt.*;

public class KlantToevoegen extends JFrame implements ActionListener {
/**
JFrame frame;
private static final long serialVersionUID = 1L;
private JButton voegToe, terug;
private JPanel contentPane;
private JTextField nmTf, strTf, hnrTf, pcTf, plTf, telnrTf, emailTf;
        lblHuisnr, lblPostcode, lblPlaats, lblTelnr, lblEmail;
private JComboBox<?> aanhefBox;
private Klantenbinding klantenBindingRef;
private JSeparator separator;
private JSeparator separator_1;
private Klant klantref;

 * Launch the application.
public static void main(String[] args) {

 * Create the frame.
public KlantToevoegen() {

public void actionPerformed(ActionEvent e) {
    String foutmelding = "Controleer of alle gegevens zijn ingevuld";
    String naam = nmTf.getText();
    String straat = strTf.getText();
    String huisnummer = hnrTf.getText();
    String postcode = pcTf.getText();
    String plaats = plTf.getText();
    String telefoonnummer = telnrTf.getText();
    String email = emailTf.getText();
    boolean allesoke = true;
    klantenBindingRef = new Klantenbinding();

    if (e.getSource() == terug) {
        KlantenbindingFrame kbf = new KlantenbindingFrame();
        kbf.setKlantenBindingRef(klantenBindingRef);
        setVisible(false);
    }

    if (e.getSource() == voegToe) {
        if ("".equals(naam) || "".equals(straat) || "".equals(huisnummer)
                || "".equals(postcode) || "".equals(plaats)
                || "".equals(telefoonnummer) || "".equals(email)) {

            allesoke = false;
            foutmelding += "\n";
        }

        if (allesoke) {
            klantref = new Klant(nmTf.getText());
            klantenBindingRef.voegKlantToe(klantref);
            System.out.println(naam + straat + huisnummer + klantenBindingRef.toString());
            JOptionPane.showMessageDialog(null, "Klant toegevoegd" + naam,
                    "Toegevoegd",   JOptionPane.INFORMATION_MESSAGE, null);
            terugHoofdmenu();



        } else {
            JOptionPane.showMessageDialog(null, foutmelding,      "Foutmelding",
                    JOptionPane.INFORMATION_MESSAGE, null);
        }
    }
}

private void terugHoofdmenu() {
    setVisible(false);
    KlantenbindingFrame kf1 = new KlantenbindingFrame();
    kf1.setKlantenBindingRef(klantenBindingRef);
    kf1.setKlantRef(klantref);
}

public void setKlantenBindingRef(Klantenbinding klantenBindingRef){
    this.klantenBindingRef = klantenBindingRef;
}

public void setDeKlant(Klant klantref){
    this.klantref = klantref;
}

}

最后是客户的课程:

public class Klant {
private String naam;

public Klant(String naam) {
    this.naam = naam;
}

public String getNaam(){
    return naam;
}

public void setNaam(String naam){
    this.naam = naam;
}

}

1 个答案:

答案 0 :(得分:3)

您的代码不会忘记任何事情。只是你创建了一个新的空(!)ArrayList来显示在你的菜单中:

klantenBindingRef = new Klantenbinding();
                    ^^^
System.out.println(klantenBindingRef.toString());

您需要使用之前初始化的相同对象实例...

另一个(不太好)选项是使用静态ArrayList

protected static List<Klant> alleKlanten = new ArrayList<Klant> ();

或使用Singleton Pattern

顺便说一下:你的setAlleKlanten函数很危险:它确实有可能让你的列表忘记所有内容(因为它只是替换列表中已存在的所有内容)