2015-09-19 81 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