2012-03-31 3 views
1

Wenn Sie den JButtonNy die Benutzereingabe als Objekt (Klasse Deltagare) in einem ArrayList hinzugefügt werden soll drücken, und wenn der Benutzer später die JButton drücken Visa, sollte es in der erscheinen.Kann Objekt hinzufügen Throught Eingabe von JTextField zu Arraylist()

Das Problem ist, dass die textArea nur eine leere Arraylist anzeigt, irgendwie wird die Eingabe nicht zur Arraylist hinzugefügt.

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

     } 
    } 
} 

und die Klasse 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; 
    } 

} 

Antwort

4

Zunächst wird der Konstruktor Ihrer Deltagare Klasse falsche Sache tut,

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

mit

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; 
} 

Dann ersetzen Sie actionListener auf alle Ihre JTextField in F1 Klasse hinzugefügt hatte, aber es ist nichts zu erfassen, wenn der Benutzer auf OK Button oder CANCEL Button geklickt hat. Dazu etwas tun, Eingang in den Konstruktor Ihrer F1 zu nehmen:

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

In der Klasse F1, zeigen Sie ein Formular innerhalb eines JOptionPane aber sie tun nichts mit der Antwort des Benutzers (OK oder Abbrechen). Sie haben eine Methode actionPerformed, die für einen ActionListener gilt, aber Sie registrieren Ihren ActionListener nie irgendwo. Ich denke, du solltest einfach das Ergebnis des JOptionPane behandeln. Wenn OK, rufen Sie den Code in Ihrem actionPerformed auf (der umbenannt werden kann).

Hinweis: showConfirmDialog ist ein blockierender Aufruf.

+0

Danke, aber wie kann ich actionlisteners für die Standard-Schaltflächen OK und Abbrechen erstellen? Soll ich einen anderen jOptionPane-Typ verwenden? – Mix

+0

@Seb müssen Sie nichts registrieren. Sie müssen einfach den zurückgegebenen Wert von showConfirmDialog anzeigen. Wenn der Wert gleich der Konstante OK ist, können Sie fortfahren, sonst ignorieren Sie einfach. –