【问题标题】:Unable to add object to ArrayList throught input by jtextField()无法通过 jtextField() 输入将对象添加到 ArrayList
【发布时间】:2012-04-14 23:49:07
【问题描述】:

当您按下JButton Ny 时,用户输入应该作为对象(类Deltagare)添加到ArrayList 中,并且当用户稍后按下@987654324 @Visa,应该会出现在JTextArea中。

问题是 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;
    }

}

【问题讨论】:

    标签: java swing arraylist jtextfield


    【解决方案1】:

    首先你的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 添加到 F1 类中的所有 JTextField 中,但是如果用户单击 OK 按钮或 CANCEL kbd> 按钮。为此,请执行以下操作,在 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 的结果。如果 OK,则调用 actionPerformed 中的代码(可以重命名)。

      注意:showConfirmDialog 是一个阻塞调用。

      【讨论】:

      • 谢谢,但是如何为默认的“确定”和“取消”按钮创建动作侦听器?我应该使用另一个 jOptionPane 类型吗?
      • @Seb 你不需要注册任何东西。您只需要查看 showConfirmDialog 的返回值。如果该值等于常量 OK,则可以继续,否则忽略。
      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 2015-12-16
      • 2015-05-24
      • 2015-12-16
      • 1970-01-01
      • 2021-06-24
      • 2015-12-16
      • 2017-02-26
      相关资源
      最近更新 更多