Java 我的算法有问题吗?

Java 我的算法有问题吗?,java,actionlistener,Java,Actionlistener,我正在创建一个addStudent方法,它如下所示: package gui; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import dataManager.DataManager; public class test extends JFrame { private static boolean addHowManyStude

我正在创建一个addStudent方法,它如下所示:

package gui;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

import dataManager.DataManager;



public class test extends JFrame {
    private static boolean addHowManyStudentsSet=false;
    private static int addHowManyStudents=0;
    private static JFrame addStudentFrame = new JFrame("Add Student");
    private static JTextField newStudentName = new JTextField();
    private static JTextField newStudentID = new JTextField();
    private static JLabel label1 = new JLabel("");
    private static final JButton addButton = new JButton("ADD");
    private static JButton addStudent = new JButton("SET");
    private static JPanel addStudentPanel = new JPanel();
    /**
     * Constructor of the GUI, creating labels, buttons, and other stuff.  Then they are added onto the interface.
     */
    public test() {
        super("test");
        setSize(200, 200);
        setLocation(10, 10);
        final JPanel panel = new JPanel();

        addStudent.setBounds(10,60,80,25);
        panel.add(addStudent);
        add(panel);
        addStudent.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                if(!addHowManyStudentsSet){
                    try{
                        addHowManyStudents=Integer.parseInt(JOptionPane.showInputDialog(panel, "Add how many students..."));
                        JOptionPane.showMessageDialog(panel,"Set, please click this button again");
                        addStudent.setText("ADD");
                        addHowManyStudentsSet=true;
                    }
                    catch(NumberFormatException ex){
                        JOptionPane.showMessageDialog(panel, "Please enter a number");
                    }
                }

                else{

                    addStudentPanel.setLayout(null);
                    label1.setText("    "+(addHowManyStudents-1)+" more students to add...");
                    label1.setFont(new Font("Segoe UI Light",Font.PLAIN,30));
                    label1.setBounds(5,20,400,25);
                    newStudentName.setBounds(270,100,140,30);
                    newStudentID.setBounds(270,150,140,30);
                    final JLabel label2 = new JLabel("New Student Name:");
                    final JLabel label3 = new JLabel("New Student Number:");
                    label2.setBounds(30,100,200,30);
                    label2.setFont(new Font("Segoe UI Light",Font.PLAIN,21));
                    label3.setBounds(30,150,200,30);
                    label3.setFont(new Font("Segoe UI Light",Font.PLAIN,21));
                    //      final JButton addButton = new JButton("ADD");
                    addButton.setBounds(330,220,80,25);
                    addStudentPanel.add(addButton);
                    addButton.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent ae){            
                            addStudent();
                            //      addStudentFrame.dispose();
                        }
                    });                 
                    addStudentPanel.add(label1);
                    addStudentPanel.add(label2);
                    addStudentPanel.add(label3);
                    addStudentPanel.add(newStudentName);
                    addStudentPanel.add(newStudentID);
                    addStudentFrame.add(addStudentPanel);
                    addStudentFrame.setVisible(true);
                    addStudentFrame.setLocation(40,40);
                    addStudentFrame.setSize(470,335);
                }

            }

        });
    }

    public static void main(String[] args) {
        JFrame f = new test(  );

        f.addWindowListener(new WindowAdapter(  ) {
            public void windowClosing(WindowEvent we) { 
                System.exit(0); }
        });
        f.setVisible(true);
    }

    private static void addStudent(){
        if(addHowManyStudents>0){
            addHowManyStudents--;           
            //          addButton.addActionListener(new ActionListener(){
            //              public void actionPerformed(ActionEvent ae){        
            System.out.println("add");
            //          //  JLabel label1 = new JLabel((StudentList.getHowManyStudentToAdd()-1)+"more students to add");
            try{
                String studentName = newStudentName.getText();
                long studentNum = Long.parseLong(newStudentID.getText());
                //          //  DataManager.addStudent(studentNum, studentName);
                System.out.println("Done: "+studentNum+", "+studentName);
            }
            catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(addStudentFrame, "Student ID can only be numbers");
            }
            if(addHowManyStudents!=0){
                label1.setText("    "+(addHowManyStudents-1)+" more students to add...");

            }
            newStudentName.setText("");
            newStudentID.setText("");
            addStudent();
            //              }               
            //          });

        }
        else if(addHowManyStudents==0){
            JOptionPane.showMessageDialog(addStudentFrame,"Done!");
            addStudentFrame.dispose();
            addHowManyStudentsSet=false;
            addStudent.setText("SET");
        }
    }
}
这实际上非常有趣,因为用户第一次单击add按钮时 例如,只添加一次学生,如果您想添加14个学生,它就可以工作 正确的第一次,告诉你还有13个学生要添加

但是,当用户第二次单击“添加”按钮时,它会添加该学生 两次增加11名学生;它在第三次单击时增加了8次3次以上 学生添加,等等


我不知道发生了什么,但它就是不能正常工作。

每次调用addStudent时,都会将ActionListener添加到JButton,这最终会导致JButton多次添加侦听器。这意味着当按下按钮时,监听器将被调用多次,这是您真正不希望发生的事情。解决办法是不这样做。相反,在构造函数或init方法中只将侦听器添加到JButton一次,并保持该状态。

每次调用addStudent时,都会将ActionListener添加到JButton,这最终会导致JButton多次添加侦听器。这意味着当按下按钮时,监听器将被调用多次,这是您真正不希望发生的事情。解决办法是不这样做。相反,只在构造函数或init方法中将侦听器添加到JButton中一次,并将其保持在该状态。

我很难理解您打算做什么。放弃该代码,重新开始。首先,去掉所有静态变量和方法。唯一应该是静态的应该是主方法——就是它。接下来,请详细描述您正在尝试做什么,因为您的代码实际上没有多大意义。。。。。幸运的是,它现在可以工作了,但是用户一次只能添加一个学生:我很难理解您打算做什么。请放弃该代码,重新开始。首先,去掉所有静态变量和方法。唯一应该是静态的应该是主方法——就是它。接下来,请详细描述您正在尝试做什么,因为您的代码实际上没有多大意义。。。。。幸运的是,现在它可以工作了,但用户一次只能添加一个学生:我确实尝试过这样做,但它不起作用,因为现在如果用户单击按钮,它将添加该学生[addHowManyStudents]次,对吗?@user1447864:这没有意义。在构建GUI时设置侦听器,只需执行一次即可。然后,如果您想将学生添加到列表或其他集合中,则不在该方法的中间添加监听器。如果你需要更多的帮助,考虑告诉我们更多关于你的计划,因为我有一种感觉,你的设计是关闭的……恐怕你是对的……我给每个按钮一个新的ActionListener。。。天哪。。。我要在这里发布整个事情,你能帮我吗?这是我12年级期末项目的一部分,是我期末成绩的30%。。。。谢谢哈哈,我简化了代码,所以现在一切都好了。非常感谢:PI确实尝试过这样做,但它不起作用,因为现在如果用户单击按钮,它将添加该学生[addHowManyStudents]次,对吗?@user1447864:这没有意义。在构建GUI时设置侦听器,只需执行一次即可。然后,如果您想将学生添加到列表或其他集合中,则不在该方法的中间添加监听器。如果你需要更多的帮助,考虑告诉我们更多关于你的计划,因为我有一种感觉,你的设计是关闭的……恐怕你是对的……我给每个按钮一个新的ActionListener。。。天哪。。。我要在这里发布整个事情,你能帮我吗?这是我12年级期末项目的一部分,是我期末成绩的30%。。。。谢谢哈哈,我简化了代码,所以现在一切都好了。非常感谢:P