1

今、私の配列リストをシリアライズするのに助けが必要です。これで、シリアル化の側面が機能するようになりました(少なくともそう思います)。今、問題はオブジェクトのシリアル化解除にあります。私は小さなアドレス帳プログラムを作っています。ユーザーが入力する場所の上に、名前、住所、電話番号の 3 つのテキスト ボックスがある住所を格納するコンボ ボックスがあります。テスト目的で、保存および読み込みボタンがあります。保存ボタンは連絡先を保存し、読み込みボタンは以前のセッションの連絡先を読み込みます。これで、デシリアライズ以外のすべてが機能し、それを続行する方法を知りたいと思います。

私のコードは次のとおりです。

import java.awt.EventQueue;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;


public class Address_Book {

    private JFrame frame;
    private JTextField newName;
    private JTextField newAddress;
    private JTextField newPhoneAddress;
    ArrayList<Book> test = new ArrayList<Book>();
    ArrayList<Book> array = new ArrayList<Book>();

    File addBook = new File("addBook.txt");

    final JComboBox<String> comboBox = new JComboBox<String>();
    final DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Address_Book window = new Address_Book();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Address_Book() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {         
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 250);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        newName = new JTextField();
        newName.setBounds(10, 29, 107, 20);
        frame.getContentPane().add(newName);
        newName.setColumns(10);

        JLabel lbl1 = new JLabel("Enter New Name:");
        lbl1.setBounds(10, 11, 107, 14);
        frame.getContentPane().add(lbl1);

        JLabel lbl2 = new JLabel("Enter New Address:");
        lbl2.setBounds(136, 11, 130, 14);
        frame.getContentPane().add(lbl2);

        newAddress = new JTextField();
        newAddress.setColumns(10);
        newAddress.setBounds(136, 29, 107, 20);
        frame.getContentPane().add(newAddress);

        newPhoneAddress = new JTextField();
        newPhoneAddress.setColumns(10);
        newPhoneAddress.setBounds(262, 29, 162, 20);
        frame.getContentPane().add(newPhoneAddress);

        JLabel lbl3 = new JLabel("Enter New Phone number:");
        lbl3.setBounds(262, 11, 162, 14);
        frame.getContentPane().add(lbl3);

        JButton btnAddNewContact = new JButton("Add new contact");
        btnAddNewContact.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent arg0) {
                test.add((new Book(newName.getText(), newAddress.getText(), newPhoneAddress.getText())));

                //mergesort.mergesort(test, 0, test.size() - 1);

                model.removeAllElements();
                for(int i=0; i < test.size();i++){
                    model.addElement(test.get(i).getContact()); 
                }
                comboBox.setModel(model);

                newName.setText(""); 
                newAddress.setText("");
                newPhoneAddress.setText("");
            }
        });
        btnAddNewContact.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        btnAddNewContact.setBounds(10, 53, 414, 23);
        frame.getContentPane().add(btnAddNewContact);

        JLabel lbl4 = new JLabel("Current Contacts:");
        lbl4.setBounds(10, 87, 107, 14);
        frame.getContentPane().add(lbl4);

        frame.getContentPane().add(comboBox);


            comboBox.setModel(model);
            comboBox.setBounds(10, 101, 414, 20);
            comboBox.setSelectedIndex(test.size()-1);

            JButton btnLoad = new JButton("Load");
            btnLoad.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {

                    try {
                        /* Read objects */

                        FileInputStream in = new FileInputStream(addBook);
                        ObjectInputStream readIn = new ObjectInputStream(in);

                        array = (ArrayList<Book>) readIn.readObject();
                        readIn.close(); 

                        for(int i=0; i < array.size();i++){
                            model.addElement(array.get(i).getContact());    
                        }
                        comboBox.setModel(model);
                    }catch(Exception e1){
                        e1.printStackTrace();
                    }

                }
            });
            btnLoad.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                }
            });
            btnLoad.setBounds(10, 132, 89, 23);
            frame.getContentPane().add(btnLoad);

            JButton btnSave = new JButton("Save");
            btnSave.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent arg0) {
                    /* write objects */
                    try{

                        FileOutputStream out = new FileOutputStream(addBook);
                        ObjectOutputStream writeAdd = new ObjectOutputStream(out);
                        writeAdd.writeObject(test);
                        writeAdd.close();

                    }catch(Exception e){

                    }
                }
            });
            btnSave.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                }
            });
            btnSave.setBounds(109, 132, 89, 23);
            frame.getContentPane().add(btnSave);
    }
}

ここに私のオブジェクトがあります:

public class Book implements Comparable {
     private String flName, Address, pNumber;

    public Book(String Name, String address, String phoneNumber ){
        setFlName(Name);
        setAddress(address);
        setpNumber(phoneNumber);
    }

    public String getpNumber() {
        return pNumber;
    }

    public void setpNumber(String pNumber) {
        this.pNumber = pNumber;
    }

    public String getAddress() {
        return Address;
    }

    public void setAddress(String address) {
        Address = address;
    }

    public String getFlName() {
        return flName;
    }

    public void setFlName(String flName) {
        this.flName = flName;
    }  

    public String getContact() {
        return flName + ", " + Address + ", " + pNumber;
    }

    public int compareTo(Object c) {
        Book testBook = (Book)c;

        if (testBook.getFlName().compareTo(this.getFlName()) < 0){
            return(-1);
        }else if(testBook.getFlName().compareTo(this.getFlName()) == 0){
            return(0);
        }else{
            return(1);
        }
    }

}

この次のコードの斑点は、私の Address_Book クラスにあります。これは、最初に提供したコードです。これは、どこからロードしているかを簡単に見つけられるようにするためです。

JButton btnLoad = new JButton("Load");
            btnLoad.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {

                    try {
                        /* Read objects */

                        FileInputStream in = new FileInputStream(addBook);
                        ObjectInputStream readIn = new ObjectInputStream(in);

                        array = (ArrayList<Book>) readIn.readObject();
                        readIn.close(); 

                        for(int i=0; i < array.size();i++){
                            model.addElement(array.get(i).getContact());    
                        }
                        comboBox.setModel(model);
                    }catch(Exception e1){
                        e1.printStackTrace();
                    }

                }
            });
            btnLoad.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                }
            });
            btnLoad.setBounds(10, 132, 89, 23);
            frame.getContentPane().add(btnLoad);

お時間をいただきありがとうございます。ご不明な点がございましたら、お気軽にお問い合わせください。:)

4

1 に答える 1

1
  • あなたの Book クラスは Serializable を実装していません。これが例外の原因であり、現在のシリアル化の試みが失敗している主な理由であるため、これを修正してくださいArrayList<Book>
  • Google でシリアライゼーションのチュートリアルを読んでください。
  • 繰り返しになりますが、ActionListener を使用する必要がある場合は、JButton で MouseListeners を使用しないでください。これは問題の原因ではありませんが、修正しないと将来の問題が発生する可能性があります。JButton の使用方法については、Java チュートリアルをお読みください。
  • 繰り返しになりますが、新しい複雑な機能を既に複雑なプログラムに実装しようとする場合は、最初に複雑なプログラムを分離して実行し、問題を分離して修正してから、より大きなプログラムに追加します。新しいコードがエラーを引き起こす場合、これは二重に当てはまります。
于 2012-06-14T21:30:25.020 に答える