【问题标题】:GUI display info from ArrayList using JButton, JTextArea and showInputDialog使用 JButton、JTextArea 和 showInputDialog 来自 ArrayList 的 GUI 显示信息
【发布时间】:2014-01-02 10:55:47
【问题描述】:

有谁知道如何使用 actionPerformed 方法遍历 ArrayList 并检索项目?

基本上我试图让用户点击一个按钮。单击该按钮后,会出现一个 showInputDialog,然后用户例如输入学生的 ID 号。该学生的所有详细信息都将显示在 jtextArea 或 showMessageDialog 框中。

谁能告诉我? 这是我只是以学生为例的实际代码。

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

public class DepotAdmin 
{
    private ArrayList<Vehicle> DepoVehicle = new ArrayList<Vehicle>(); 
    public DepotAdmin(String hd,String c, String m, String d,Fuel p,int EngSize)
    {
          DepoVehicle = new ArrayList<Vehicle>();

    }


     private void setupDepot(){
        //DepotArraylist vehicles = new DepotArraylist("1111","1111","1111","1111",new Fuel(""),0);

        DepoVehicle.add(new Car("BobMart","567890","Volvo","04/06/2014", new Fuel("Diesel"),6000));
        DepoVehicle.add(new Car("BobMart","465783","BMW","12/052014", new Fuel ("Petrol"), 8000));
        DepoVehicle.add(new Car("BobMart","348709","Ford","13/08/2014",new Fuel ("Petrol"), 3000));
        DepoVehicle.add(new Car("BobMart","145367","Lexus","18/08/2015",new Fuel ("Diesel"), 2000));
        DepoVehicle.add(new RentableCar("BobMart","847469","Citreon","08/07/2015",new             Fuel("Diesel"),1000));
        Car car1 = new Car("BobMart","567890","Volvo","04/06/2014", new Fuel("Diesel"),6000);



    public Vehicle byMake(String make)
    {
            String st[]=DepoVehicle.toArray(new String[DepoVehicle.size()]); 
              for ( Vehicle v : DepoVehicle)
         if (v.getMake().equals(make)){
            return v;
            }
           return null;

      }




    private JFrame Depot ;
    private JMenu Vehicles;
    private JMenu searchVehicle;    
    private JMenu rentVehicle;    
    private JMenu returnVehicle;
    private JMenuItem vehicles1;
    private JMenuItem searchVehicle1;
    private JMenuItem rentVehicle1;
    private JMenuItem returnVehicle1; 
    private JTextArea textArea;
    private JMenuBar menubar;
    private JList vList;
    private ResDepotAdmin listener;
    private ResDepotAdmin listener1;
    private ResDepotAdmin listener2;
    private ResDepotAdmin listener3;
    private JLabel repeatLabel;
    private JTextField inputText;
    private JPanel textPanel;
    public DepotAdmin(){
    //creating the frame to place the menu bar
    Depot = new JFrame ("Depot");
    //creating the menubar to place the menu items
    menubar = new JMenuBar();
    //set the menu bar in the frame
    Depot.setJMenuBar(menubar);
    //set the menus on the menu bar
    Vehicles = new JMenu ("vehicles");
    menubar.add(Vehicles);
    searchVehicle = new JMenu ("search");
    menubar.add(searchVehicle);
    rentVehicle = new JMenu ("rent");
    menubar.add(rentVehicle);
    returnVehicle = new JMenu ("return");
    menubar.add(returnVehicle);
    //set the menu items on the menues
    vehicles1 = new JMenuItem ("Vehicle List");
    Vehicles.add(vehicles1);
    searchVehicle1 = new JMenuItem ("Search Vehicle");
    searchVehicle.add(searchVehicle1);
    rentVehicle1 = new JMenuItem ("Rent Vehicle");
    rentVehicle.add(rentVehicle1);
    returnVehicle1 = new JMenuItem ("Return Vehicle");
    returnVehicle.add(returnVehicle1);
    //data display section
    textArea = new JTextArea(70,70);
    textPanel = new JPanel();
    //add textarea to panel
    textPanel.add(textArea);
    //add panel to frame
    Depot.add((textPanel),BorderLayout.CENTER);
    listeners to respond to click by uaer
    listener = new ResDepotAdmin();
    listener1 = new ResDepotAdmin();
    listener2 = new ResDepotAdmin();
    listener3 = new ResDepotAdmin();
    vehicles1.addActionListener(listener);
    searchVehicle1.addActionListener(listener1);
    rentVehicle1.addActionListener(listener2);
    returnVehicle.addActionListener(listener3);


    String vehicleMake = "make";
    //JOptionPane.showInputDialog(searchVehicle1,"Enter vehicle make");
    //set the size of the frame
    Depot.setSize(600,600);
    //aet the visibility of the frame
    Depot.setVisible(true);
    //prevent the running the the program on exit
    Depot.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



         }
         public class ResDepotAdmin implements ActionListener
    {


       private String make; 
     private void setupDepot(){
        DepotArraylist vehicles = new DepotArraylist("1111","1111","1111","1111",new Fuel(""),0);
        vehicles.addVehicle(new Car("BobMart","567890","Volvo","04/06/2014", new Fuel("Diesel"),6000));
        vehicles.addVehicle(new Car("BobMart","465783","BMW","12/052014", new Fuel ("Petrol"), 8000));
        vehicles.addVehicle(new Car("BobMart","348709","Ford","13/08/2014",new Fuel ("Petrol"), 3000));
        vehicles.addVehicle(new Car("BobMart","145367","Lexus","18/08/2015",new Fuel ("Diesel"), 2000));
        vehicles.addVehicle(new RentableCar("BobMart","847469","Citreon","08/07/2015",new Fuel("Diesel"),1000));
        Car car1 = new Car("BobMart","567890","Volvo","04/06/2014", new Fuel("Diesel"),6000);



}


         public Vehicle findVehicle(String make)
          {
           for (Vehicle dv : DepoVehicle)
             if (dv.getMake().equals(make))
            return dv;
              return null;
            }


             public void actionPerformed(ActionEvent e)
             {
                       //DepotAdmin DepoVehicle = new DepotAdmin("null","null","null","null",new Fuel(""),0);

                       ArrayList<Vehicle> DepoVehicle = new ArrayList<Vehicle>();
                               DepoVehicle.add(new Car("BobMart","567890","Volvo","04/06/2014",    new Fuel("Diesel"),6000));
                               DepoVehicle.add(new Car("BobMart","348709","Ford","13/08/2014",new Fuel ("Petrol"), 3000));


                     if ( e.getSource() == vehicles1){
                     textArea.append(DepoVehicle.toString()+"\n"+"\n");
                     }


                     String make = JOptionPane.showInputDialog(null,"Enter vehicle make");

                      if (e.getSource()== searchVehicle1){

                           for ( Vehicle v : DepoVehicle){ if (v.getMake().equals(make)){
                                                        textArea.append(make);

                                                                  }
                                                     }

                     }
            }
      }
}

【问题讨论】:

    标签: java swing arraylist


    【解决方案1】:

    我真的不知道如何解释您有关于汽车的消息这一事实,但您希望学生作为输入。所以我稍微改变了一下。相应地进行更改。

    我刚刚循环,如果学生 ID 与输入匹配,我将学生附加到文本区域

    public void actionPerformed{
    
       String stuId = JOptionPane.showInputDialog(null,"Enter Student ID");
    
       for (Student student : pupils){
           if (student.getId().equals(stuId)){
               textArea.append(student);
               break;
           }
       }
    }
    

    • 另外,我注意到您在 main 方法中有一个 actionPerformed。您是否正在尝试创建 GUI 程序?因为此时,您的代码远未完成。

    • 您似乎在main 中也有一个方法,这是一个不可以的方法。您的代码绝不会编译。请发布一个可编译的程序,这样我们就可以准确地看到您要完成的工作。因为你帖子里的代码很垃圾。


    我注意到的另一个巨大错误在这里

        String name;
        String id;
        public Student (String n, String i) {
            n = name;
            i = id;
        }
    

    你的构造函数是错误的。 n = name 什么都不做。相反,你想要

        name = n;
        id = i;
    

    同样Student 接受一个字符串输入,但您正在尝试添加一个int。也许这只是为了尝试 SSCCE,但它是从文本字段中获取这些输入,它会起作用,但如果你很难对其进行编码,它们需要是字符串。

        pupils.add(new Student("james", "2345"));
        pupils.add(new Student ("taylor", "5768"));
        pupils.add(new Student("andy", "9874"));
    

    对于你的Student 类,如果你想要Student 对象的String 表示,你应该@Override toString() 方法,像这样

        public String toString() {
           //am i wrong here?  
            return "Student Name: " + name + ", ID: " + id;
        }
    

    这是一个简单的完整的可运行程序,因此您可以了解所有内容是如何组合在一起的。检查它,看看你可能哪里出错了。随时提问。

    import java.awt.BorderLayout;
    import java.awt.event.*;
    import java.util.ArrayList;
    import javax.swing.*;
    
    public class StudentGUI extends JFrame {
    
        private JTextArea jtaStudent = new JTextArea(10, 30);
        private JButton showStudents = new JButton("Show Students");
        ArrayList<Student> pupils = new ArrayList<>();
    
        public StudentGUI() {
            pupils.add(new Student("james", "2345"));
            pupils.add(new Student("taylor", "5768"));
            pupils.add(new Student("andy", "9874"));
    
            add(showStudents, BorderLayout.SOUTH);
            add(jtaStudent, BorderLayout.CENTER);
    
            showStudents.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    for (Student student : pupils) {
                        jtaStudent.append(student + "\n");
                    }
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new StudentGUI();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    
                }
            });
        }
    }
    
    class Student {
        String name;
        String id;
    
        public Student(String n, String i) {
            name = n;
            id = i;
        }
    
        public String getName() {
            return name;
        }
    
        public String getId() {
            return id;
        }
    
        public String toString() {
            // am i wrong here?
            return "Student Name: " + name + ", ID: " + id;
        }
    }
    

    【讨论】:

    • 是的,它确实是我正在创建的汽车市场。我只是用学生有例子。这是实际的代码
    • 我刚刚发布了实际代码,其中包含我执行您建议的循环的所有位,但我应该将汽车列表放在哪里,以便通过 actionPerformed 方法看到它
    • actionPerformed 是否在 DepotAdmin 类中?很难遵循您的代码。
    【解决方案2】:

    您创建了一个构造函数:

    public Students(parameter, parameter){}
    

    ,但您没有为以下各项创建构造函数:

    public Student(){}
    

    通常,如果你自己不创建任何构造函数,编译器会为你创建一个无参数的协程函数,但是当你自己创建任何构造函数时,你需要自己创建一个无参数的构造函数。希望这会有所帮助。

    【讨论】:

    • 在他的代码中我没有看到对默认构造函数的调用...编译器不会创建默认构造函数,如果超类有一个并且它的公共或受保护,则您可以从超类中获得它。
    • 私有 ArrayList DepoVehicle = new ArrayList();这应该会产生一个错误,它是如何执行的?
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多