2012-03-31 66 views
1

當按下JButton尹恩惠用戶輸入應該被添加作爲一個對象(類Deltagare)至ArrayList的throught輸入在ArrayList,並且當用戶以後按JButtonVisa,它應該顯示在JTextArea無法添加對象通過的JTextField()

問題是,textArea只顯示一個空的Arraylist,不知何故輸入不添加到Arraylist。

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import javax.swing.*; 

class Tävling extends JFrame 
{ 
    public static ArrayList<Deltagare> list = new ArrayList<Deltagare>(); 

    JTextArea text = new JTextArea(); 

    JRadioButton rb1 = new JRadioButton("Startnr", true); 
    JRadioButton rb2 = new JRadioButton("Namn", false); 
    JRadioButton rb3 = new JRadioButton("Ålder", false); 
    JRadioButton rb4 = new JRadioButton("Tid", false); 

    Tävling() 
    { 
     super ("DSV Kista Marathon"); 
     setLayout(new BorderLayout()); 

     //NORTH 
     JPanel north = new JPanel(); 
     north.add(new JLabel("DSV Kista Marathon")); 
     add(north, BorderLayout.NORTH); 

     //CENTER 
     add(new JScrollPane(text), BorderLayout.CENTER); 
     text.setEditable(false); 

     //EAST  
     JPanel east = new JPanel(); 
     east.setLayout(new BoxLayout(east, BoxLayout.Y_AXIS)); 
     east.add(new JLabel("Sortering")); 

     east.add(rb1); 
     east.add(rb2); 
     east.add(rb3); 
     east.add(rb4); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(rb1); 
     group.add(rb2); 
     group.add(rb3); 
     group.add(rb4); 

     add(east, BorderLayout.EAST); 

     //SOUTH 
     JPanel south = new JPanel(); 

     JButton b1 = new JButton("Ny"); 
     b1.addActionListener(new B1()); 
     south.add(b1); 

     JButton b2 = new JButton("Visa"); 
     b2.addActionListener(new B2()); 
     south.add(b2); 

     JButton b3 = new JButton("Tid"); 
     b3.addActionListener(new B3()); 
     south.add(b3); 

     add(south, BorderLayout.SOUTH); 

     //Set 
     setLocation(500,200); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(300,350); 
     setVisible(true); 

    } 

    //Metod för att skapa startnr 
    public int getStartnr() 
    { 
     int startnr = list.size()+1; 
     return startnr; 
    } 

    public static void main(String[] args) 
    { 
     new Tävling(); 
    } 

    //Huvudklass slut ------------------------------------------------------  


    //b1 - Ny 
    class B1 implements ActionListener 
    { 
     public void actionPerformed(ActionEvent ave) 
     { 
      new F1(); 
     } 
    } 

    //b2 - Visa 
    class B2 implements ActionListener 
    { 
     public void actionPerformed(ActionEvent ave) 
     { 
      if (rb1.isSelected()) 
       text.append(list.toString() + "\n"); 
      else if (rb2.isSelected()) 
       text.setText("Namn"); 
      else if (rb3.isSelected()) 
       text.setText("Ålder"); 
      else if (rb4.isSelected()) 
       text.setText("Tid"); 
     } 
    } 

    //b3 - Tid 
    class B3 implements ActionListener 
    { 
     public void actionPerformed(ActionEvent ave) 
     { 
      new F2(); 
     } 
    } 


    //JOptionPane - Ny (Deltagare) 
    class F1 implements ActionListener 
    {  
     JTextField nfield = new JTextField(12); 
     JTextField cfield = new JTextField(12); 
     JTextField afield = new JTextField(3); 

     F1() 
     { 
      JPanel form = new JPanel(); 
      form.add(new JLabel("Startnr "+ getStartnr())); 
      form.setLayout(new BoxLayout(form, BoxLayout.Y_AXIS)); 

      JPanel r1 = new JPanel(); 
      r1.add(new JLabel ("Namn:")); 
      r1.add(nfield); 
      form.add(r1); 
      nfield.addActionListener(this); 

      JPanel r2 = new JPanel(); 
      r2.add(new JLabel ("Land:")); 
      r2.add(cfield); 
      form.add(r2); 
      cfield.addActionListener(this); 

      JPanel r3 = new JPanel(); 
      r3.add(new JLabel ("Ålder:")); 
      r3.add(afield); 
      form.add(r3); 
      afield.addActionListener(this); 

      JOptionPane.showConfirmDialog(null, form, "Ny Tävlande" 
              , JOptionPane.OK_CANCEL_OPTION); 
     } 

     public void actionPerformed(ActionEvent ave) 
     { 
      String name = nfield.getText(); 
      String country = cfield.getText(); 
      int age = Integer.parseInt(afield.getText()); 
      int startnr = getStartnr(); 

      list.add(new Deltagare(name, country, age, startnr));  
     } 
    } 

    //JOptionPane - Tid (Registrera ny) 
    class F2 
    {  
     JTextField field1 = new JTextField(6); 
     JTextField field2 = new JTextField(6); 

     F2() 
     { 
      JPanel form = new JPanel(); 
      form.setLayout(new BoxLayout(form, BoxLayout.Y_AXIS)); 

      JPanel r1 = new JPanel(); 
      r1.add(new JLabel ("Startnr:")); 
      r1.add(field1); 
      form.add(r1); 

      JPanel r2 = new JPanel(); 
      r2.add(new JLabel ("Tid:")); 
      r2.add(field2); 
      form.add(r2); 

      JOptionPane.showConfirmDialog(null, form, "Registrera Tid" 
              , JOptionPane.OK_CANCEL_OPTION); 

     } 
    } 
} 

和類Deltagare:

public class Deltagare 
{ 
    public String name,country; 
    public int age,startnr; 

    public Deltagare(String n, String c, int a, int b) 
    { 
     this.name = "n"; 
     this.country = "c"; 
     this.age = a; 
     this.startnr = b; 
    } 

    public void setStartnr(int b) 
    { 
     startnr = b; 
    } 

    public int getStartnr() 
    { 
     return startnr; 
    } 

    public String getName() 
    { 
     return name;  
    } 

    public String getCountry() 
    { 
     return country; 
    } 

    public int getAge() 
    { 
     return age; 
    } 

    public String toString() 
    { 
     return startnr + "" + name + " " + country + " " + age; 
    } 

} 

回答

4

Deltagare類的所有構造函數的第一個做錯了事情,更換

public Deltagare(String n, String c, int a, int b) 
{ 
    this.name = "n"; 
    this.country = "c"; 
    this.age = a; 
    this.startnr = b; 
} 

public Deltagare(String n, String c, int a, int b) 
{ 
    // removed quotes to assign value of n to name and same for country. 
    this.name = n; 
    this.country = c; 
    this.age = a; 
    this.startnr = b; 
} 

然後,又增加了actionListener所有的JTextFieldF1類,但有是什麼都沒有捕獲什麼,如果用戶點擊按鈕或取消按鈕。對於此做這樣的事情,把你輸入的F1的構造函數中:

F1() 
{ 
    JPanel form = new JPanel(); 
    form.add(new JLabel("Startnr "+ getStartnr())); 
    form.setLayout(new BoxLayout(form, BoxLayout.Y_AXIS)); 

    JPanel r1 = new JPanel(); 
    r1.add(new JLabel ("Namn:")); 
    r1.add(nfield); 
    form.add(r1); 
    nfield.addActionListener(this); 

    JPanel r2 = new JPanel(); 
    r2.add(new JLabel ("Land:")); 
    r2.add(cfield); 
    form.add(r2); 
    cfield.addActionListener(this); 

    JPanel r3 = new JPanel(); 
    r3.add(new JLabel ("Ålder:")); 
    r3.add(afield); 
    form.add(r3); 
    afield.addActionListener(this); 

    int choice = JOptionPane.showConfirmDialog(null, form, "Ny Tävlande" 
             , JOptionPane.OK_CANCEL_OPTION); 
    // If the value of the user is OK, then do this, else do nothing.        
    if (choice == JOptionPane.OK_OPTION) 
    { 
     String name = nfield.getText(); 
     String country = cfield.getText(); 
     int age = Integer.parseInt(afield.getText()); 
     int startnr = getStartnr(); 

     list.add(new Deltagare(name, country, age, startnr)); 
    } 
    else if (choice == JOptionPane.CANCEL_OPTION) 
    { 
     System.out.println("CANCEL OPTION SELECTED, DO SOMETHING NOW :-)"); 
    } 
} 
2

在你的類F1,你表現出的JOptionPane中的形式,但你不與用戶的響應做任何事情(確定或取消)。你有一個方法actionPerformed,但是它是一個ActionListener,但是你從來沒有在任何地方註冊你的ActionListener。我認爲你應該簡單地對待JOptionPane的結果。如果確定,然後調用您的actionPerformed(可以重命名)中的代碼。

注意:showConfirmDialog是一個阻塞調用。

+0

謝謝你,但我怎麼可以創建默認的ActionListeners確定和取消按鈕?我應該使用另一個jOptionPane類型嗎? – Mix 2012-03-31 16:27:33

+0

@Seb你不需要註冊任何東西。您只需查看showConfirmDialog的返回值即可。如果該值等於常量OK,則可以繼續,否則就忽略。 – 2012-03-31 17:04:27