GUI 将 JTextField 添加到 ArrayList

Posted

技术标签:

【中文标题】GUI 将 JTextField 添加到 ArrayList【英文标题】:GUI adding JTextField to an ArrayList 【发布时间】:2015-12-16 22:01:42 【问题描述】:

我删除了我的另一篇帖子,因为我被告知它不是具体的,并返回一个更具体的问题,这里是......

该程序应该接受联系信息(名字和姓氏,电话,电子邮件),然后单击添加按钮,将创建一个联系人对象并转到一个 ArrayList。然后,当单击查看按钮时,您将看到添加到其中的所有联系人。

我一直在观看教程并阅读有关如何使用 GUI 的书籍,并且能够创建一个包含所有必要内容的窗口来添加联系信息。

我的问题:我正在苦苦挣扎的是如何将此信息添加到数组列表中

在我弄清楚如何添加信息后,我将研究如何在单击查看按钮时查看它。

任何关于推动我前进的帮助或提示将不胜感激!

public class InputForm extends JFrame 
    private static JPanel panel;
    private static JLabel firstNameLabel;
    private static JLabel lastNameLabel;
    private static JLabel phoneNumLabel;
    private static JLabel emailLabel;
    private static JLabel contactMessage;
    private static JTextField  firstNameInput;
    private static JTextField  lastNameInput;
    private static JTextField  phoneInput;
    private static JTextField  emailInput;
    private static JButton addButton;
    private static JButton viewButton;
    private String fn;
    private String ln;
    private String ph;
    private String em;
    private List<String> list = new ArrayList<String>();

public InputForm() 
    int windowWidth = 650;
    int windowHeight = 550;

    //Window title
    setTitle("CONTACT FORM");
    //Set window size.
    setSize(windowWidth, windowHeight);
    //Exit on close 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Buld the panel and add it the the JFrame.
    buildPanel();
    //Add the panel to the frames content pane
    add(panel);
    //Display the window.
    setVisible(true);   


private void buildPanel() 

    panel = new JPanel();

    addButton = new JButton("Add Contact");
    viewButton = new JButton("View Contacts");

    firstNameLabel = new JLabel("First Name");
    firstNameInput = new JTextField(10);
    lastNameLabel = new JLabel("Last Name: ");
    lastNameInput = new JTextField(10);
    phoneNumLabel = new JLabel("Phone Number: ");
    phoneInput = new JTextField(10);
    emailLabel = new JLabel("Email: ");
    emailInput = new JTextField(10);


    /*Add labels, text fields and buttons to the panel*/
    panel.add(firstNameLabel);
    panel.add(firstNameInput);
    panel.add(lastNameLabel);
    panel.add(lastNameInput);
    panel.add(phoneNumLabel);
    panel.add(phoneInput);
    panel.add(emailLabel);
    panel.add(emailInput);
    panel.add(addButton);
    panel.add(viewButton);

    theHandler handler = new theHandler();
    addButton.addActionListener(handler);
    viewButton.addActionListener(handler);




private class theHandler implements ActionListener 

public void actionPerformed(ActionEvent event) 
    fn = firstNameInput.getText();
    ln = lastNameInput.getText();
    ph = phoneInput.getText();
    em = emailInput.getText();
    Contact con = new Contact(fn, ln, ph, em);  

    if(event.getSource() == addButton) 
        list.add(con);  
    
    else if(event.getSource() == viewButton) 
        JOptionPane.showMessageDialog(null,"Contact Info:\n" + con);        
    
    else if(event.getSource() == viewButton) 
        JOptionPane.showMessageDialog(null, con);       
    





public static void main(String[] args) 
    new InputForm();




好的,这是我根据“满载鳗鱼的气垫船”的建议创建的一个联系人类。

public class Contact 
    private String fn;
    private String ln;
    private String ph;
    private String em;

private List<Contact> list = new ArrayList<Contact>();

public Contact(String fn, String ln, String ph, String em)  
    this.fn = fn;
    this.ln = ln;
    this.ph = ph;
    this.em = em;

    public String getFirstName() 
        return fn;
    
    public void setFirstName(String fn) 
        this.fn = fn;
    

    public String getLastName() 
        return ln;
    
    public void setLastName(String ln) 
        this.ln = ln;
    

    public String getPhone() 
        return ph;
    
    public void setPhone(String ph) 
        this.ph = ph;
    

    public String getEmail() 
        return fn;
       
    public void setEmail(String em) 
        this.em = em;
    

    public String toString() 
        return "First Name: " + getFirstName() + "\n" +
                "Last Name: " + getLastName() + "\n" +
                "Phone Number: " + getPhone() + "\n" +
                "Email: " + getEmail() + "\n";
    

public static void main(String[] args) 
    new InputForm();



【问题讨论】:

你现在有什么问题?这能编译吗?您还有其他问题吗? 【参考方案1】:

建议:

    首先,创建一个非 GUI 联系人类,一个包含名字、姓氏、电话号码和电子邮件地址的字段,一个具有将四个字段的字符串作为参数的体面构造函数,一个具有getter 和 setter 方法。 还给Contact一个像样的public String toString()覆盖方法。当您想要调试代码时,这可能会非常很有帮助。 将您的 List 设为 List&lt;Contact&gt; 和 ArrayList 相同 -- 它应该是 ArrayList&lt;Contact&gt;。 在您的处理程序 ActionListener 中,从 JTextField 中提取字符串,并创建一个联系人对象。 然后将联系人对象添加到您的列表中。 在向列表中添加数据时,无需像您正在使用的那样使用迭代器。您只需创建一个 Contact 实例并调用 List 的 add(...) 方法即可。 大功告成。

附带建议(与您的主要问题无关):

    继续阅读并尝试使用布局管理器,因为使用它们可以使您的 GUI 看起来更令人愉悦且功能更强大。 对于这种类型的数据输入,我喜欢使用 GridBagLayout,而且我通常给我的类一个帮助方法来创建 GridBagConstraints 以简化它的使用。 我尽量避免扩展 JFrame,因为这会迫使您创建和显示 JFrame,而通常需要更大的灵活性。事实上,我敢冒险说,我创建的大部分 Swing GUI 代码扩展了 JFrame,事实上你很少愿意这样做这。更常见的是,您的 GUI 类将用于创建 JPanel,然后可以将其放置到 JFrame 或 JDialogs 或 JTabbedPanes 中,或者在需要时通过 CardLayouts 交换。这将大大增加您的 GUI 编码的灵活性。 一个不错的 toString 方法会显示类字段的状态。例如,对于 Contact 类,它将创建并返回一个 String,其中包含该联系人的名字、姓氏、电话号码和电子邮件地址。然后,如果您需要调试程序并遍历 List 以查看其中包含的内容,您只需在 List 中的每个 Contact 项目上调用 System.out.println(myContact);,就会打印出有用的信息。此外,如果您在 JList 中显示 List,则默认使用 toString 来显示 JList 模型中的每个项目。 您的代码严重过度使用了 static 修饰符,这使它成为非面向对象的,因此代码有些不灵活。我建议您的大多数字段都应该是非静态实例字段。

例如:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

@SuppressWarnings("serial")
public class InputForm2 extends JPanel 
    private static final int COLS = 10;
    private List<ShoppingItem> shoppingList = new ArrayList<>();
    private JTextField nameField = new JTextField(COLS);
    private JTextField skuField = new JTextField(COLS);
    private JTextField priceField = new JTextField(COLS);    

    public InputForm2() 
        JPanel formPanel = new JPanel(new GridBagLayout());
        formPanel.add(new JLabel("Item Name:"), createGbc(0, 0));
        formPanel.add(nameField, createGbc(1, 0));
        formPanel.add(new JLabel("Item SKU:"), createGbc(0, 1));
        formPanel.add(skuField, createGbc(1, 1));
        formPanel.add(new JLabel("Price:"), createGbc(0, 2));
        formPanel.add(priceField, createGbc(1, 2));

        JPanel btnPanel = new JPanel(new GridLayout(1, 0, 4, 4));
        btnPanel.add(new JButton(new AddItemAction("Add Item")));
        btnPanel.add(new JButton(new DisplayItemsAction("Display Items")));

        setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        setLayout(new BorderLayout());
        add(formPanel, BorderLayout.CENTER);
        add(btnPanel, BorderLayout.PAGE_END);
    

    private static GridBagConstraints createGbc(int x, int y) 
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = x == 0 ? GridBagConstraints.WEST : GridBagConstraints.EAST;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        int inset = 4;
        int leftInset = x == 0 ? inset : 3 * inset;
        gbc.insets = new Insets(inset, leftInset, inset, inset);
        return gbc;
    

    private class AddItemAction extends AbstractAction 
        public AddItemAction(String name) 
            super(name);
            int mnemonic = (int) name.charAt(0); // mnemonic keystroke
            putValue(MNEMONIC_KEY, mnemonic);
        

        @Override
        public void actionPerformed(ActionEvent e) 
            // TODO finish this
            // get Strings from fields
            // create ShoppingItem object
            // add to shoppingList

        
    

    private class DisplayItemsAction extends AbstractAction 
        public DisplayItemsAction(String name) 
            super(name);
            int mnemonic = (int) name.charAt(0); // mnemonic keystroke
            putValue(MNEMONIC_KEY, mnemonic);
        

        @Override
        public void actionPerformed(ActionEvent e) 
            // TODO finish this

        
    

    private static void createAndShowGui() 
        InputForm2 mainPanel = new InputForm2();

        JFrame frame = new JFrame("InputForm2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                createAndShowGui();
            
        );
    


class ShoppingItem 
    private String name;
    private String skuNumber;
    private double price;
    public ShoppingItem(String name, String skuNumber, double price) 
        this.name = name;
        this.skuNumber = skuNumber;
        this.price = price;
    
    public String getName() 
        return name;
    
    public String getSkuNumber() 
        return skuNumber;
    
    public double getPrice() 
        return price;
    

    @Override
    public String toString() 
        return String.format("name: %s, sku: %s, price: $%0.df", name, skuNumber, price);        
    

请注意,这使用了不同的非 GUI 类和 JTextFields,但我希望您获得并借用这些想法,而不是代码。 :)


编辑

关于您更新的问题,您的错误消息告诉您确切出了什么问题。这段代码:

    if(event.getSource() == addButton) 
    fn = firstNameInput.getText();
    ln = lastNameInput.getText();
    ph = phoneInput.getText();
    em = emailInput.getText();
    list.add(fn + "\n" + ln + "\n" + ph + "\n" + em + "\n");   

不会将 Contact 对象添加到列表中,而是尝试将连接的字符串(以换行符作为分隔符的字符串???)添加到列表中,但此处不允许也不想要字符串。再次按照我上面的建议,您应该使用文本字段中保存的字符串,创建一个联系人对象,然后将该对象添加到您的列表中。

【讨论】:

是的,在我得到它实际上正常工作之后,我的下一步是弄乱布局管理器以使其看起来不错。 @user3862586:看看我在上面的示例代码中的意思。 大声笑我永远不会借用你的代码,但我非常感谢你的想法!我更新了我的代码,但我仍然在 list.add 中遇到错误,因为我也将它更改为 List,错误说字符串参数不适用于 List @user3862586:我刚刚注意到您的代码严重过度使用了静态修饰符。您的大多数字段都不应该是静态的。请更改此设置。 @user3862586:错误消息告诉您确切您做错了什么。当您需要添加 new Contact(...) 对象时,您正在尝试将字符串添加到列表中。【参考方案2】:

您不需要迭代器来将元素添加到列表中。并且您可能希望将所有数据添加为 1 个字符串。使用多个 add();将创建多个条目...更好的方法是创建一个包含所有参数作为字段的联系人对象,并使用 List 而不是 List

public void actionPerformed(ActionEvent event) 

    if(event.getSource() == addButton) 
        fn = firstNameInput.getText();
        ln = lastNameInput.getText();
        ph = phoneInput.getText();
        em = emailInput.getText();
        list.add(fn + ", " + ln + ", " + ph + ", " + em + ".");
        
    
    else if(event.getSource() == viewButton) 
        JOptionPane.showMessageDialog();        
    

【讨论】:

感谢您的信息,但我在 list.add 上遇到错误,说字符串类型的参数不适用于 List 并且 showMessageDialog() 需要两个参数 如果您想将 List 更改为 List - 您需要创建一个 Contact 类。该类的对象将适合 List。如果您想保留 List ,您可以为每个联系人添加 1 个字符串(例如以逗号分隔)。

以上是关于GUI 将 JTextField 添加到 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing JtextField 插图

使用 DocumentListener 实现检查 JTextField

错误查询从 jTextField 插入到表 sql

如何从另一个 java 类中的 jTextField 或 jFormattedTextField 获取数据

GUI基础1

尝试使用 Netbeans 将 Image 添加到 Mysql