【问题标题】:ArrayList in ActionListener isnt workingActionListener 中的 ArrayList 不起作用
【发布时间】:2017-11-24 10:04:29
【问题描述】:

我制作了一个名为DoctorsCare 的Java 程序,患者可以在其中预约医生。因此,在预约面板中,我包括了患者 ID、姓名、性别、出生日期、地址和简短的患者病史。

所有这些字符串值都将被放入一个数组列表中,并在填写预约表并单击提交按钮后最终返回到新选项卡(医生选项卡)。我写的数组列表代码有一些问题,但我可以运行程序。

我只需要知道我在哪里犯了错误以及如何将数组列表值返回到医生选项卡。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.Normalizer.Form;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.*;

public class NewPage extends JFrame implements ActionListener{

    JFrame frame1= new JFrame();
    JTextField id;
    JLabel label = new JLabel("Patient ID:");
    JLabel label2 = new JLabel("Name:");
    JLabel label3 = new JLabel("Gender:");
    JLabel label4 = new JLabel("Date of Birth:");
    JLabel label5 = new JLabel("Address:");
    JLabel label7 = new JLabel("Phone:");
    JLabel label6= new JLabel("brief patient history:");
    JPanel panel1 = new JPanel();
    JTextArea phistry = new JTextArea(11,31);
    JTextField text1 = new JTextField(20);
    JTextField text2 = new JTextField(20);
    JTextField text3 = new JTextField(20);
    JTextField text4 = new JTextField(20);
    JTextField text5 = new JTextField(20);
    JTextField text6 = new JTextField();
    JTextField text7 = new JTextField(20);
    JButton button = new JButton("SUBMIT");

    NewPage()
    {
        frame1.setTitle("Booking Appointment");      
        frame1.setVisible(true);
        frame1.setSize(330,470);
        frame1.add(panel1);
        panel1.add(label);

        panel1.add(text1);
        panel1.add(label2);
        panel1.add(text2);
        panel1.add(label3);
        panel1.add(text3);
        panel1.add(label4);
        panel1.add(text4);
        panel1.add(label5);
        panel1.add(text5);
        panel1.add(label7);
        panel1.add(text7);
        panel1.add(label6);
        panel1.add(phistry);
        panel1.add(button);
        button.setPreferredSize(new Dimension(160,40));
        button.addActionListener(this);             
    }



    \\the button code
    public void actionPerformed(ActionEvent e) {     

        List<List<String>> model = new ArrayList<List<String>>(); 

        text1.selectAll(); \\selects the input from user
        text2.selectAll();
        text3.selectAll();
        text4.selectAll();
        text5.selectAll();
        text6.selectAll();
        String ID = text1.getSelectedText(); \\initializes ID
        String PName = text2.getSelectedText();
        String Gender = text3.getSelectedText();
        String DoB = text4.getSelectedText();
        String Address = text5.getSelectedText();
        //String phone = text7.getSelectedText();
        String phistry = text6.getSelectedText();

        //String phistry = text6.getSelectedText();

        List<String> line = Arrays.asList(new String[]{ID, PName, Gender, DoB, Address, phistry});
        model.add(line);

        StringBuilder sb = new StringBuilder();
        sb.append("ID\tFirst\tLast\tCourse\tYear\n");
        for(List<String> input : model) {
            for (String item : input) {
                sb.append(item);
                if (input.indexOf(item) == input.size()-1) {
                    sb.append("\n");
                } else {
                    sb.append("\t");
                }
            }
        }
    }
}

【问题讨论】:

  • “一些问题”“不起作用”..你能把它翻译成更专业的术语吗?
  • minimal reproducible example。运行时有什么具体问题?
  • 你到底想用那个 selectAll() 做什么?只需在所有字段上使用 getText()。
  • @utkarsh31 直到您了解制造事物的危险static,请停止提供任何建议。
  • "并且会相应地处理它们...... OP 会做什么更相关。这不是关于你的。跨度>

标签: java swing actionlistener


【解决方案1】:

首先您的List 包含模型信息,但您没有在actionPerformed 方法中的文本区域中设置它,

this.phistry.setText(sb.toString());

假设您在一个单独的类中有 Doctors 选项卡,如下所示(否则您可以直接在 NewFrame 中设置模型,

class DoctorsPanel extends JPanel {

    private List<List<String>> model;
    JTextArea history;

    public DoctorsPanel() {
        model = new LinkedList<>();
        history = new JTextArea(11, 31);
        setLayout(new GridLayout(1, 1));
        add(history);
    }

    public void setModel(List<List<String>> model) {
        this.model = model;
        setHistory();
    }

    private void setHistory() {
        this.history.setText(getModelData());
    }

    private String getModelData() {
        StringBuilder sb = new StringBuilder();
        sb.append("ID\tFirst\tLast\tCourse\tYear\n");
        for (List<String> input : model) {
            for (String item : input) {
                sb.append(item);
                if (input.indexOf(item) == input.size() - 1) {
                    sb.append("\n");
                } else {
                    sb.append("\t");
                }
            }
        }
        return sb.toString();
    }

}

您可以在NewFrame 中拥有如下所示的选项卡式窗格,

 JTabbedPane jTab = new JTabbedPane();
 panel1 = new JPanel();
 panel2=new DoctorsPanel();
 jTab.add("Book", panel1);
 jTab.add("Doctors", panel2);
 frame1.add(jTab);

然后您可以在预约时进行设置。
即当对 tab1 组件执行操作时

public void actionPerformed(ActionEvent e) {     

        List<List<String>> model = new ArrayList<List<String>>(); 

        String ID = text1.getText();
        String PName = text2.getText();
        String Gender = text3.getText();
        String DoB = text4.getText();
        String Address = text5.getText();
        String phistry = text6.getText();

        List<String> line = Arrays.asList(new String[]{ID, PName, Gender, DoB, Address, phistry});
        model.add(line);

        StringBuilder sb = new StringBuilder();
        sb.append("ID\tFirst\tLast\tCourse\tYear\n");
        for(List<String> input : model) {
            for (String item : input) {
                sb.append(item);
                if (input.indexOf(item) == input.size()-1) {
                    sb.append("\n");
                } else {
                    sb.append("\t");
                }
            }
        }
        this.phistry.setText(sb.toString());//sets the text in tab1
        panel2.setModel(model);//sets the model in Doctors panel
    }

但我建议将变量 model List 保留在类 NewFrame 中作为成员而不是局部变量来保存先前添加的信息

【讨论】:

  • 最后一行“panel2.setModel(model);”显示编译错误,所以当我在 Doctors Panel 类中的 setModel 方法之后使用这一行时,它仍然显示编译错误。
  • @code_buoy22 你在哪里使用了setModel 电话?根据您的代码,模型变量是本地变量,仅适用于 actionPerformed 方法。如果要全局使用,请将其声明为 NewFrame 类的成员
  • 我不确定,我们是否可以在外面聊天。你能试试这个link吗?
  • 我在 DoctorsPanel 类中调用了 setModel。就在定义 setModel 之后。
  • @code_buoy22 您能否发布您的最小代码以了解您正在尝试什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多