方法`actionPerformed()`多次执行(超过可数)

时间:2016-02-26 09:37:04

标签: java swing event-dispatch-thread

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()内的任何内容正在执行多次。它应该只执行一次。

2 个答案:

答案 0 :(得分:2)

第1步。

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

第2步。

你正在考虑线性方式,这不是GUI的工作方式,GUI是事件驱动的,也就是说,未来可能发生的事情,你需要相应地回应它

例如,我们假设pJButton,您可能会将它们声明为您班级中的实例字段...

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允许您实时监控文本字段状态的更改并相应地更新按钮的状态...

答案 1 :(得分:1)

谈论你的代码;并添加了

  

if(p.getActionListeners()。length == 0){//此行修复添加多个   次

    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); 
                    }
                });
            }
        }
    }