【问题标题】:Adding to a store from JTextfields from JPanel/JFrame从 JPanel/JFrame 从 JTextfields 添加到商店
【发布时间】:2016-02-28 03:13:55
【问题描述】:

我开发了一个 store 类,其中包含来自员工和人员类的信息。

在我的控制器类中,我向商店添加了一名员工:

Employee e1 = new Employee("Dave", 'M', new Date(01,1,80), "01", new Date(02,2,2002));

我想做的是使用从 JPanel/JFrame 中的键盘输入的信息向商店添加更多员工。我已经开发了 JTextfields 和 JButtons。

我已经定义了按钮和字段:

JButton enterButton;
JTextField name;
JTextField gender;
JTextField dob;
JTextField id;
JTextField startDate;

我已经构建了它们中的每一个,它们都出现在 JPanel 上。我知道我需要添加 actionListener 并按如下方式完成:

myEventHandler h = new myEventHandler();

enterButton.addActionListener(h);
name.addActionListener(h);
gender.addActionListener(h);
dob.addActionListener(h);
id.addActionListener(h);
startDate.addActionListener(h);

然后我创建了一个类:

private class myEventHandler implements ActionListener {

public void actionPerformed(ActionEvent e) {

但正是在这一点上我的代码崩溃了:

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

如何使单击此 enterButton 获取输入到五个 JTextfields 中的信息并将其作为新员工添加到我的商店类中?

我已经对此进行了研究,我将把它放在这里作为最后的手段。非常感谢一些让我再次前进的建议。

【问题讨论】:

    标签: java arrays eclipse swing arraylist


    【解决方案1】:

    由于您已经声明了JTextFields,您只需正确使用它们即可创建新的Employee。更困难的部分是将字符串正确转换为Date。我还建议对带有日期的文本字段使用JFormattedTextField

    我使用substring()Integer.parseInt() 将字符串转换为日期。请注意,您必须从月份中减去 1,因为它从 0 开始计数(因此 0 = 一月)。您还必须从年份中减去 1900,因为它是“年份减去 1900”(Reference)

    这是一个例子,Employee-class 只是将参数打印到JTextArea(所以我们知道它是正确的)。

    输出:

    代码:

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.swing.JButton;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class Example {
    
        JButton enterButton;
        JTextField name;
        JTextField gender;
        JFormattedTextField dob;
        JTextField id;
        JFormattedTextField startDate;
        JTextArea outputArea;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Example();
                }
            });
    
        }
    
        public Example() {
    
            JFrame frame = new JFrame();
    
            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
            MyEventHandler eventHandler = new MyEventHandler();
    
            enterButton = new JButton("Apply");
            enterButton.addActionListener(eventHandler);
    
            name = new JTextField(10);
            name.addActionListener(eventHandler);
    
            gender = new JTextField(10);
            gender.addActionListener(eventHandler);
    
            dob = new JFormattedTextField(df);
            dob.setColumns(10);
            dob.addActionListener(eventHandler);
    
            id = new JTextField(10);
            id.addActionListener(eventHandler);
    
            startDate = new JFormattedTextField(df);
            startDate.setColumns(10);
            startDate.addActionListener(eventHandler);
    
            JPanel inputPanel = new JPanel();
            inputPanel.add(name);
            inputPanel.add(gender);
            inputPanel.add(dob);
            inputPanel.add(id);
            inputPanel.add(startDate);
            inputPanel.add(enterButton);
    
            outputArea = new JTextArea();
    
            frame.getContentPane().setLayout(new BorderLayout());
            frame.getContentPane().add(inputPanel, BorderLayout.NORTH);
            frame.getContentPane().add(new JScrollPane(outputArea));
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setSize(frame.getWidth(), 400);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        private class MyEventHandler implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Employee(name.getText(), gender.getText(), getDateOf(dob), id.getText(), getDateOf(startDate));
            }
        }
    
        @SuppressWarnings("deprecation")
        private Date getDateOf(JFormattedTextField field) {
            int year = Integer.parseInt(field.getText().substring(6, 10)) - 1900;
            int month = Integer.parseInt(field.getText().substring(3, 5)) - 1;
            int date = Integer.parseInt(field.getText().substring(0, 2));
            return new Date(year, month, date);
        }
    
        public class Employee {
    
            public Employee(String name, String gender, Date dob, String id, Date startDate) {
                outputArea.append((name + "\n" + gender + "\n" + dob + "\n" + id + "\n" + startDate + "\n"));
            }
    
        }
    
    }
    

    【讨论】:

    • 您不想将侦听器添加到除 enterButton 之外的任何内容。否则,每当用户在任何文本字段中完成输入内容时,此代码将添加一个新员工,然后在任何其他字段中输入任何内容。
    • @FredK 我不完全理解。正如您在我的 gif/代码中看到的那样,它没有。它只会在您在其中一个文本字段中按 Enter 时添加一个新的 Employee(这是 OP 想要的),而不是在您切换文本字段时。
    • @LuxxMiner 我认为这是可行的,但我的问题是如何将其添加到我的 arrayList 中。 new Employee(name.getText(), gender.getText(), getDateOf(dob), id.getText(), getDateOf(startDate)); 似乎可以工作,但是我该如何将它添加到我的 'Contoller' 类中的 ArrayList 中?
    • @LuxxMiner 话虽如此,当我尝试运行它时,我得到了一个java.lang.NullPointerException。我现在完全迷路了。
    【解决方案2】:
    1. 您使用了错误的侦听器。你必须使用KeyListener 来实现你想要的。
    2. 使用 Java Bean 命名约定:每个类的名称都必须以大写字母开头。

    您的代码将如下所示:

    public class MyKeyListener implements KeyListener {
        @Override
        public void keyPressed(KeyEvent evt) {
    
        }
    
        @Override
        public void keyReleased(KeyEvent evt) {
    
        }
    
       @Override
       public void keyTyped(KeyEvent evt) {
           if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
              // do your stuff here
           }
       }
    }
    

    并将此侦听器添加到您的一个或每个文本字段中。

    【讨论】:

    • ActionListener 也会自动注册回车键事件,不需要KeyListener。另外问题似乎是如何获取文本字段的所有信息并从中制作新的Employee
    • 好吧,先生,我不知道。但是,既然您确实指出了这一点,那么如果您回答这个问题会很好。顺便说一句,谢谢 =)
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2012-08-30
    相关资源
    最近更新 更多