2

在这个程序中,我必须创建一个 GUI,将联系人的对象保存到一个数组中,然后将其转换为一个数组以传递给默认表模型的构造函数。我知道我在这里做了一个额外的步骤。

备份按钮实际上将联系人向量中的任何内容保存到二进制文件中。加载按钮会将您在用户名中输入的任何文件名加载回向量中。查看所有联系人应显示向量中的所有内容(从技术上讲是contactListArray)。

我遇到了无法JTable更新视图卡的问题。如果我加载联系人,然后单击它显示的加载联系人,那么我知道数据正在正确写入 .dat 文件。问题似乎是,一旦我单击视图按钮,它JTable正在创建并且不会更改,即使我已将其设置为更改方法。

我认为问题出在哪里,if(source == viewBut) 我认为整个街区可能是问题所在。提前感谢您的帮助,我真的很感激。

/*
* Lab number: Final Project
* Robert Lopez
* Section number: 4
*/

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.event.*;
import javax.swing.table.TableModel;


class Contact implements Serializable{ String firstName, lastName, eAddress, address, phoneNum; }

public class finalLab implements ActionListener{
    static CardLayout layout;

    static private JFrame frame = new JFrame("Address Book");

    static private JButton[] topMenuButton = new JButton[5];

    static private Vector<Contact> contactList = new Vector<Contact>();
    static private int contactSize = 0;

    static private String[] columnNames = {"First Name", "Last Name","E-Mail Address", "Address", "Phone Number"};

    static private String[][] contactListArray;

//START--------------------------Menu Card----------------------------------------------

        static JPanel menuCard = new JPanel(new BorderLayout());

    static JPanel menuTop = new JPanel( new GridLayout(2,1) );

    static private JLabel firstLabel = new JLabel("Use The Buttons Below To Manage Contacts");


    static JPanel menuMid = new JPanel(new FlowLayout());
    static private JLabel userName = new JLabel("User Name:");
    static private JTextField userNameField = new JTextField("", 15);
    static private JLabel numContacts = new JLabel("Number of Contacts:");
    static private JTextField numContactsField= new JTextField("", 15);


    static private JPanel menuLower = new JPanel(new GridLayout(2,8));
    static private JButton loadBut = new JButton("Load Contacts");
    static private JButton addBut = new JButton("Add New Contacts");
    static private JButton searchBut = new JButton("Search Contacts");
    static private JButton sortBut = new JButton("Sort Contacts");
    static private JButton deleteBut = new JButton("Delete Contacts");
    static private JButton viewBut = new JButton("View All Contacts");
    static private JButton backupBut = new JButton("Backup Contacts");
    static private JButton blankBut = new JButton("");

//END---------------------------------Menu Card------------------------------------




//START---------------------------------View Card------------------------------------

    //View Panel

    static private JPanel viewCard = new JPanel(new BorderLayout());
    static private JPanel viewCardLower = new JPanel();

    static private JLabel viewLabel = new JLabel("Contact List");

    static private JTable viewContacts;

    static private JPanel viewCardMid = new JPanel(new BorderLayout());
    static private JTableHeader header;
    static private JScrollPane scrollPane = new JScrollPane();


//END---------------------------------View Card------------------------------------




//START-----------------------------------Delete Card------------------------------------

         //Delete Panel
    static private JPanel deleteCard = new JPanel(new GridLayout (3,1));
    static private JPanel deleteMid = new JPanel();
    static private JPanel deleteLower = new JPanel();

    static private JLabel deleteLabel = new JLabel("Delete Contacts");
    static private JLabel contactInfoLabel = new JLabel("Contact Phone #");
    static private JTextField contactInfoField = new JTextField("", 15);

//END-----------------------------------Delete Card---------------------------------




//START-----------------------------------Add Contact-------------------------------

    static private JPanel addCard = new JPanel(new GridLayout(6,2));
    static private JLabel firstNameLabel = new JLabel("First Name");
    static private JLabel lastNameLabel = new JLabel("Last Name");
    static private JLabel eAddressLabel = new JLabel(" E-Mail Address");
    static private JLabel addressLabel = new JLabel("Address");
    static private JLabel phoneNumLabel = new JLabel("Phone No.");

    static private JTextField firstNameField = new JTextField("", 10);
    static private JTextField lastNameField = new JTextField("", 10);
    static private JTextField eAddressField = new JTextField("", 10);
    static private JTextField addressField = new JTextField("", 10);
    static private JTextField phoneNumField = new JTextField("", 10);

    static private JButton saveContactBut = new JButton("Save New Contact");

    static private JPanel addLowerLeft = new JPanel();
    static private JPanel addLowerRight = new JPanel();

//END------------------------------------Add Contact-----------------------------





//******************************   MAIN METHOD   *******************************




    static JPanel contentPane = (JPanel)frame.getContentPane();


    static private JPanel mainPanel = new JPanel();

    public static void main(String[] args){
        ActionListener AL = new finalLab();




        mainPanel.setLayout(layout = new CardLayout() );

        contentPane.setLayout(new BorderLayout());


        //Buttons, Labels
        loadBut.addActionListener(AL);
        for(int i = 0; i < 5; i++){
            topMenuButton[i] = new JButton("Top Menu");
            topMenuButton[i].addActionListener(AL);
        }
        backupBut.addActionListener(AL);
        viewBut.addActionListener(AL);
        addBut.addActionListener(AL);
        deleteBut.addActionListener(AL);
        saveContactBut.addActionListener(AL);

//-------------------------------------------------------

        //Top Menu

        firstLabel.setHorizontalAlignment(JTextField.CENTER);
        firstLabel.setFont(new Font( "serif", Font.BOLD, 25 ));
        menuTop.add(firstLabel);

        numContactsField.setEditable(false);
        numContactsField.setText("" + contactSize);

        //Adding Middle Content
        menuMid.add(userName);
        menuMid.add(userNameField);
        menuMid.add(numContacts);
        menuMid.add(numContactsField);


        //Adding Lower Content
        menuLower.add(loadBut);
        menuLower.add(addBut);
        menuLower.add(searchBut);
        menuLower.add(sortBut);
        menuLower.add(deleteBut);
        menuLower.add(viewBut);
        menuLower.add(backupBut);
        menuLower.add(blankBut);

        menuCard.add(menuTop, BorderLayout.NORTH);
        menuCard.add(menuMid, BorderLayout.CENTER);
        menuCard.add(menuLower, BorderLayout.SOUTH);

//-------------------------------------------------------

        //Delete Card
        deleteLabel.setHorizontalAlignment(JTextField.CENTER);
        deleteLabel.setFont(new Font( "serif", Font.BOLD, 25 ));
        deleteCard.add(deleteLabel);
        deleteMid.add(contactInfoLabel);
        deleteMid.add(contactInfoField);
        deleteCard.add(deleteMid);
        deleteLower.add(topMenuButton[0]);
        deleteCard.add(deleteLower);

//-------------------------------------------------------


        //Add Card
        firstNameLabel.setHorizontalAlignment(JTextField.RIGHT);
        lastNameLabel.setHorizontalAlignment(JTextField.RIGHT);
        eAddressLabel.setHorizontalAlignment(JTextField.RIGHT);
        addressLabel.setHorizontalAlignment(JTextField.RIGHT);
        phoneNumLabel.setHorizontalAlignment(JTextField.RIGHT);

        addCard.add(firstNameLabel);
        addCard.add(firstNameField);
        addCard.add(lastNameLabel);
        addCard.add(lastNameField);
        addCard.add(eAddressLabel);
        addCard.add(eAddressField);
        addCard.add(addressLabel);
        addCard.add(addressField);
        addCard.add(phoneNumLabel);
        addCard.add(phoneNumField);

        addLowerLeft.add(saveContactBut);
        addLowerRight.add(topMenuButton[1]);

        addCard.add(addLowerLeft);
        addCard.add(addLowerRight);

//----------------------------------------------------------

        //View Card

        viewLabel.setHorizontalAlignment(JTextField.CENTER);
        viewLabel.setFont(new Font( "serif", Font.BOLD, 25 ));
        viewCard.add(viewLabel, BorderLayout.NORTH);
        viewCardLower.add(topMenuButton[2]);
        viewCard.add(viewCardLower, BorderLayout.SOUTH);











        //Adding to frame

        mainPanel.add("Menu Card", menuCard);
        mainPanel.add("Delete Card", deleteCard);
        mainPanel.add("Add Card", addCard);
        //mainPanel.add("View Card", viewCard);

        contentPane.add(mainPanel); 
        layout.show(mainPanel, "Menu Card");

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700, 275);
        frame.setResizable(false);
        frame.setVisible(true);


    }


public void actionPerformed(ActionEvent e){
    Object source =e.getSource();


    if(source == loadBut){
        try {
            FileInputStream fis = new FileInputStream (userNameField.getText());
            ObjectInputStream ois = new ObjectInputStream(fis);
            contactList.clear();
            contactSize = 0;
            for(; true; contactSize++){
                 contactList.add( (Contact) ois.readObject() );

            numContactsField.setText("" + (contactSize+1) );

            }
        } catch(EOFException e2){
        } catch(Exception e2){ 
            e2.printStackTrace();
        } 



    }
    if(source == addBut)
        layout.show(mainPanel, "Add Card");

    if(source == viewBut){
        contactListArray = new String[contactSize][5];

        for(int i = 0; i < contactSize; i++){
            contactListArray[i][0] = contactList.get(i).firstName;
            contactListArray[i][1] = contactList.get(i).lastName;
            contactListArray[i][2] = contactList.get(i).eAddress;
            contactListArray[i][3] = contactList.get(i).address;
            contactListArray[i][4] = contactList.get(i).phoneNum;
        }



        DefaultTableModel model = new DefaultTableModel(contactListArray,columnNames);
        viewContacts = new JTable(model);

        header = viewContacts.getTableHeader();

        viewContacts.setFillsViewportHeight(true);

        viewContacts.revalidate();
        viewCardMid.add(header, BorderLayout.NORTH);
        viewCardMid.add(viewContacts, BorderLayout.CENTER);

        viewCard.add(viewCardMid, BorderLayout.CENTER);

        mainPanel.add("View Card", viewCard);

        layout.show(mainPanel, "View Card");
    }

    if(source == deleteBut)
        layout.show(mainPanel, "Delete Card");


    if(source == saveContactBut){
        contactList.add(new Contact());

        contactList.get(contactSize).firstName = firstNameField.getText();
        contactList.get(contactSize).lastName = lastNameField.getText();
        contactList.get(contactSize).eAddress = eAddressField.getText();
        contactList.get(contactSize).address = addressField.getText();
        contactList.get(contactSize).phoneNum = phoneNumField.getText();

        contactSize++;

        firstNameField.setText("");
        lastNameField.setText("");
        eAddressField.setText("");
        addressField.setText("");
        phoneNumField.setText("");
    }


    if(source == backupBut){
        try{
            FileOutputStream fos = new FileOutputStream (userNameField.getText(), false);
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            for(int i = 0; i < contactSize; i++)
                oos.writeObject(contactList.get(i));
            oos.close();
        }
        catch (IOException e2){
            System.out.println("IO Exception " + e2);
        }
    }

    for(int i = 0; i < 5; i++)
        if(source == topMenuButton[i]){
            layout.show(mainPanel, "Menu Card");
            numContactsField.setText("" + contactSize);
        }
}
}   
4

2 回答 2

2

问题在于您对表格和工作原理缺乏了解CardLayout

// This is good...
DefaultTableModel model = new DefaultTableModel(contactListArray, columnNames);
// This is bad...
viewContacts = new JTable(model);

// This is bad...and raises some eyebrows
header = viewContacts.getTableHeader();

// This okay, but doesn't belong here, and is pointless given the following code...
viewContacts.setFillsViewportHeight(true);

// Pointless, you've not added the component to anything yet..
viewContacts.revalidate();
// ??  What ??
viewCardMid.add(header, BorderLayout.NORTH);
// Not good.  The table should be added to a JScrollPane first and the scroll
// pane added to the card
viewCardMid.add(viewContacts, BorderLayout.CENTER);

// Okay, but wrong place...
viewCard.add(viewCardMid, BorderLayout.CENTER);

// Here is your main problem.  The card layout only allows one component to exist
// for a given name.  If you try and add another card, it is discarded and the first
// component with that name remains
mainPanel.add("View Card", viewCard);

// Not bad...
layout.show(mainPanel, "View Card");

与其在按下视图按钮时创建表视图,不如在首次创建 UI 时初始化视图并在单击视图按钮时替换/更新表模型...

在您的构造函数中,您应该添加...

viewContacts = new JTable(); // Don't need the model at this stage
viewContacts.setFillsViewportHeight(true);
viewCardMid.add(new JScrollPane(viewContacts), BorderLayout.CENTER);
mainPanel.add("View Card", viewCard);

在您的视图中按钮操作代码...

DefaultTableModel model = new DefaultTableModel(contactListArray, columnNames);
viewContacts.setModel(model);
mainPanel.add("View Card", viewCard);

此外,正如开始指出的那样,您不应该使用static类字段,它在您的情况下不是必需的,并且随着程序复杂性的增加会导致您出现问题。

您应该if-else在您的操作执行方法中使用语句,这将减少逻辑错误的可能性并有助于提高性能

您还应该研究将每个视图的逻辑移动到它自己的类中,以减少主类中的混乱

花时间阅读使用 JFC/Swing 创建 GUI,特别是,我会研究如何使用表格如何使用 CardLayout

于 2012-12-04T23:45:43.063 回答
0

你让你的变量是静态的。静态变量的内存不是在堆栈上分配,而是在常规内存中。我没有详细查看您的代码,但我会尝试删除您类中的所有静态变量并从那里重试。

于 2012-12-04T23:36:58.437 回答