方法 `actionPerformed()` 被执行了几次(多于可数)

method `actionPerformed()` getting executed several times(more than countable)

while(b==true){
    if((!tf.getText().equals("")) ){
        System.out.println("outside actionPerformed");
        p.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){     
                System.out.println("Hello");                
                ne.remove(p);
                ne.revalidate();
                ne.repaint();
                System.out.println("why"+EventQueue.isDispatchThread()); 
                b=false;
                System.out.println(b); 
            }
        });
    }
}

actionPerformed()里面的东西被执行了好几次。它应该只执行一次。

谈论你的代码;并添加

if(p.getActionListeners().length==0){ //this line fix adding multiple times

    while(b==true){ //loops multiple times and add multiple actionlistener and dangerous because of you CPU will be top while this loops run :)
        if((!tf.getText().equals("")) ){
            System.out.println("outside actionPerformed");
            if(p.getActionListeners().length==0){ //this line fix adding multiple times
                p.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){     
                        System.out.println("Hello");                
                        ne.remove(p);
                        ne.revalidate();
                        ne.repaint();
                        System.out.println("why"+EventQueue.isDispatchThread()); 
                        b=false; //This line execute when an action occurs
                        System.out.println(b); 
                    }
                });
            }
        }
    }

步骤 1.

摆脱你的线程,你不需要,事实上,线程在 Swing 中是一个危险的东西,需要非常小心地对待

第 2 步

您正在考虑线性方式,这不是 GUI 的工作方式,GUI 是事件驱动的,也就是说,将来可能会发生某些事情,您需要相应回应

例如,假设 p 是一个 JButton,您可以将它们声明为 class...

中的实例字段
private JButton p;
private JTextField tf;

然后当你初始化 UI 时(可能在构造函数中),你会设置 p 并注册它是 ActionListener...

p = new JButton("Go");
p.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Hello");
        ne.remove(p);
        ne.revalidate();
        ne.repaint();
        System.out.println("why" + EventQueue.isDispatchThread());
        b = false;
        System.out.println(b);
    }
});
p.setEnabled(false);

设置 p 禁用将阻止用户单击它。这有两个好处,一是它可以防止 ActionListener 被触发,二是它向用户发送了一条明确的消息,即他们无法单击此按钮。据我所知,目前您的按钮可以被点击,但没有执行任何操作...有点让用户感到沮丧

然后设置文本字段...

tf = new JTextField(20);
tf.getDocument().addDocumentListener(new DocumentListener() {

    protected void update() {
        p.setEnabled(tf.getText().trim().length() > 0);
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        update();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        update();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        update();
    }
});

本例中的 DocumentListener 允许您实时监控文本字段状态的变化并相应地更新按钮的状态...