0

編集

文字列の等価性のために .equals メソッドをクリーンアップし、ContactsCollection の初期化を次のように変更しました。

public static ArrayList<Contact> contactList = new ArrayList<Contact>();

「連絡先の表示」で複数の連絡先が表示されることを期待して、アクションの実行方法も変更しました。

    if (contactInput.equals("Display contacts"))
    {
        ContactsCollection.read();
        for (int i = 0; i < contactList.size(); i++)
        {
            contact = (Contact)contactList.get(i);
            for (int j =0; j < contactList.size(); j++)
            {
                textArea.append(contact.getName() + "," + contact.getNumber() + "\n");
            }
        }
    }

最終的に .dat ファイルが書き込まれますが、GUI から追加されたデータは含まれていません。

編集終了

非常に基本的な連絡先マネージャーとして機能する携帯電話の GUI を作成しています。意図したとおりに動作している ArrayList を処理しない他のクラスがいくつかあります。

ファイルに連絡先を追加しようとすると、ContactsCollection クラスの 13 行目で null ポインター例外が発生します。

for (int i = 0; i < contactList.size(); i++)

Contacts (GUI) クラスの 93 行目:

contactList.add(contact);

Contacts および ContactsCollection クラスをコーディングするときに何か間違ったことをしたような気がします。プログラムが次のように実行されることを願っています。ユーザーは連絡先の追加をクリックして情報を入力します。この情報は連絡先オブジェクトになり、contactList ArrayList に追加され、ファイル「contactList.dat」に書き込まれます (シリアル化されます)。ユーザーが連絡先の表示をクリックすると、ファイルが読み込まれ、各連絡先が GUI に表示されます。

ArrayList のセットアップ方法にはいくつかの問題があると思いますが、希望どおりにプログラムを実行することに非常に近づいていると思います。どんな助けでも大歓迎です!

連絡先クラス:

import java.util.*;
import java.io.*;

public class Contact implements Serializable
{
public static final long serialVersionUID = 42L;
public String name, number;

Contact()
{
    name = "No name";
    number = "No number";
}

Contact (String theName, String theNumber)
{
    this.name = theName;
    this.number = theNumber;
}

public void setName(String aName)
{
    this.name = aName;
}

public void setNumber(String aNumber)
{
    this.number =aNumber;
}

public String getName()
{
    return name;
}

public String getNumber()
{
    return number;
}

public String toString()
{
    return name + ": " + number;
}

public boolean equals(Contact other)
{
   if (name.equals(other.getName()) && number.equals(other.getNumber()))
   {
      return(true);
   }
   else
   {
      return(false);
   }
}   
}

連絡先コレクション クラス

import java.io.*;
import java.util.*;

class ContactsCollection
{
public static ArrayList<Contact> contactList;

public static void write()
{
    try 
    {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("contactList.dat"));
        for (int i = 0; i < contactList.size(); i++)
        {
            out.writeObject(contactList.get(i));
        }
        out.close();
    } 
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

public static void read()
{
contactList = new ArrayList<Contact>();
try
{
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat"));
    Contact temp;
    while (in.available()!=0)
    {
        temp = (Contact)in.readObject();
        contactList.add(temp);
    }
    in.close();
}
catch(FileNotFoundException e)
{
    e.printStackTrace();
}
catch(IOException e)
{
    e.printStackTrace();
}
catch(ClassNotFoundException e)
{
    e.printStackTrace();
}       

}
}

連絡先 (GUI) クラス

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.Timer;
import java.util.*;

class Contacts extends JFrame implements ActionListener, WindowListener
{
public static final int WIDTH = 400;
    public static final int HEIGHT = 600;
    public static final int SMALL_WIDTH = 200;
    public static final int SMALL_HEIGHT = 100;

private static final Dimension stdBtn = new Dimension(150, 50);    

    JPanel centerPanel, northPanel, southPanel;
ImageIcon icon;
JLabel picture;
JButton addContact, displayContacts;
JScrollPane scroll;
JTextArea textArea;
Clock clock;
Background background;
Contact contact;
ArrayList<Contact> contactList;


public Contacts()
{
    super("Contacts");
    this.setLayout(new BorderLayout());
    this.setSize(WIDTH, HEIGHT);
    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    addWindowListener(this);
    this.setLocationRelativeTo(null);

    centerPanel = new JPanel();
    northPanel = new JPanel();
    southPanel = new JPanel();

    centerPanel.setBackground(Color.BLACK);
    southPanel.setBackground(Color.BLACK);      

    clock = new Clock();
    northPanel.add(clock);

    icon = new ImageIcon("ContactsBackground.jpg");
    picture = new JLabel(icon);
    centerPanel.add(picture);

    textArea = new JTextArea("", 10, 30);
    textArea.setEditable(false);
    JScrollPane scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);    
    centerPanel.add(scroll);    

    JButton displayContacts = new JButton("Display contacts");
    displayContacts.addActionListener(this);
    southPanel.add(displayContacts);

    JButton addContact = new JButton("Add contact");
    addContact.addActionListener(this);
    southPanel.add(addContact);

    this.add(northPanel, BorderLayout.NORTH);
    this.add(centerPanel, BorderLayout.CENTER);
    this.add(southPanel, BorderLayout.SOUTH);       

    setResizable(false);        
}

public void actionPerformed(ActionEvent e)
{
    contactList = new ArrayList<Contact>();
    JButton source = (JButton)e.getSource();
    String contactInput = source.getText();

    if (contactInput == "Display contacts")
    {
        ContactsCollection.read();
        for (int i = 0; i < contactList.size(); i++)
        {
            contact = (Contact)contactList.get(i);
            textArea.setText(contact.getName() + "," + contact.getNumber() + "\n");
        }
    }
    if (contactInput == "Add contact")
    {
        String name = JOptionPane.showInputDialog(null, "Enter Name");
        String number = JOptionPane.showInputDialog(null, "Enter Number");
        contact = new Contact(name, number);
        contactList.add(contact);
        ContactsCollection.write();
    }
}

public void windowOpened(WindowEvent e)
{}

public void windowClosing(WindowEvent e)
{
    this.setVisible(false);
    background = new Background();
    background.setVisible(true);        
}

public void windowClosed(WindowEvent e)
{}

public void windowIconified(WindowEvent e)
{}

public void windowDeiconified(WindowEvent e)
{}

public void windowActivated(WindowEvent e)
{}

public void windowDeactivated(WindowEvent e)
{}      
}
4

1 に答える 1

3

変化する

public static ArrayList<Contact> contactList;

public static ArrayList<Contact> contactList = new ArrayList<>();

あなたのバージョンcontactListではnull、それを初期化しないためであり、write()メソッドで呼び出そうとsize()しているからです。


また、GUI クラス (actionPerformed()メソッド内) には重大な欠陥がいくつかあります。この質問を読んで修正してください: Java で文字列を比較するにはどうすればよいですか?


textArea.setText(...)また、 は の完全なテキストを設定することを覚えておいてtextAreaください。これはコード内のループにあるため、 にtextAreaはそのループの最後の反復の出力のみが含まれます。あなたの場合、それは最後の連絡だけになります。

于 2013-05-15T05:12:14.520 に答える