2015-09-19 80 views
2

我删除了我的其他职位,因为我被告知这是不特定的,并用更具体的问题,在这里不用回来....GUI添加的JTextField到一个ArrayList

程序应该采取联系信息(首先&姓氏,电话,电子邮件),然后你点击一个添加按钮,一个联系人对象将被创建并转到一个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(); 

} 
} 
+0

你现在有什么问题?这是否编译?你还有其他问题吗? – markspace

回答

4

建议:

  1. 首先,创建一个非GUI Contact类,一个有名字段,姓氏,电话号码和电子邮件地址,一个一个体面的构造函数将字段的字符串作为参数,其中一个使用getter和setter方法。
  2. 也给联系一个体面的public String toString()重写方法。当你想调试你的代码时,这可以是很有用有帮助。
  3. 使您的列表成为List<Contact>,ArrayList相同 - 它应该是ArrayList<Contact>
  4. 在您的处理程序ActionListener中,从JTextFields中提取字符串,并创建一个Contact对象。
  5. 然后将联系人对象添加到您的列表。
  6. 将数据添加到列表时,不需要像使用迭代器那样使用迭代器。您只需创建一个Contact实例并调用列表的add(...)方法,就是这样。
  7. 你完成了。

方建议(无关你的主要问题):

  1. 阅读上,并与布局管理器作为其使用播放可以使你的GUI看起来更赏心悦目和更加实用。
  2. 对于这种类型的数据输入,我喜欢使用GridBagLayout,并且通常还会为我的类创建一个帮助器方法来创建GridBagConstraints以简化其使用。
  3. 我尝试避免扩展JFrame,因为这会强制您创建和显示JFrame,而且通常需要更多的灵活性。事实上,我敢打赌,我已经创建了大多数Swing GUI代码,而且我已经看到了而不是扩展了JFrame,事实上很少有人会想要这样做。更常见的是,您的GUI类将专门用于创建JPanel,然后可将其放置到JFrame或JDialogs或JTabbedPanes中,或在需要时通过CardLayouts进行交换。这将大大增加您的GUI编码的灵活性。
  4. 体面的toString方法会显示类的字段的状态。例如,对于Contact类,它将创建并返回一个包含该联系人的名字,姓氏,电话号码和电子邮件地址的字符串。然后,如果您需要调试程序并遍历列表以查看它的内容,则可以简单地在列表中的每个联系人项目上调用System.out.println(myContact);,并打印有用的信息。另外,如果您在JList中显示List,默认情况下会使用toString来显示JList模型中的每个项目。
  5. 您的代码严重过度使用静态修饰符,这使得它非面向对象,因此代码不灵活。我建议大多数你的字段应该是非静态的实例字段。

例如,像:

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类和JTextField的,但我希望你能和借用的想法,而不是代码。 :)


编辑

关于你更新的问题,你的错误信息,告诉你究竟什么是错误的。此代码:

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"); 

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

+0

@ user3862586:请参阅编辑以回答。 –

+0

是的,当我得到这个实际工作正确后,我的下一步是混乱布局管理器,使它看起来不错。 – NoobCoderChick

+0

@ user3862586:在上面的示例代码中查看我的意思。 –

1

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

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();   
    } 
+0

感谢您的信息,但我在list.add上发现错误,指出字符串类型的参数不适用于列表并且showMessageDialog()需要两个参数 – NoobCoderChick

+0

如果要将列表更改为列表 - 您需要创建一个Contact类。该类的对象将适用于列表。如果您想要使用列表,则可以为每个联系人添加1个字符串(例如,用逗号分隔)。 – chenchuk