Java - (非内部)可运行类中的Actionlistener不执行

时间:2013-10-25 13:23:48

标签: java multithreading swing oop

我正在尝试为java swing GUI制作干净的OOP代码。 所以我创建了一个实现Runnable的类,并且应该处理所有操作。 我存储在充满getter和setter的数据类中的所有数据和组件。

public class UserInterface{
...
    public void foo(){
        PanelActions panelActions = new PanelActions(); 
        Thread tProgressbar = new Thread(panelActions, "Update progressbar");
        tProgressbar.start();
    }
}

public class PanelActions implements Runnable{
    GUIdata data = new GUIdata();
    public void run(){

        //submitButton 
        data.getSubmitButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt) {
                  //Some code
            }           
        }); 

        //Browse Button
        data.getBrowseButton().addActionListener(new ActionListener(){      
            @Override
            public void actionPerformed(ActionEvent evt) {
                  //Some code
            }           
        }); 
    };  
}

以及getter和setter类:

public class GUIdata{
    private JButton submitButton;
    private JButton browseButton;

    GUIdata(){
        submitButton = new JButton();
        browseButton = new JButton();
    }

    public JButton getSubmitButton() {
        return submitButton;
    }

    public void setSubmitButton(JButton submitButton) {
        this.submitButton = submitButton;
    }

    public JButton getBrowseButton() {
        return browseButton;
    }

    public void setBrowseButton(JButton browseButton) {
        this.browseButton = browseButton;
    }
}

但是这样行动中的代码不起作用。线程启动,运行方法运行良好。但可能它不喜欢在get方法中添加ActionListener。即使我试过这个:

JButton browse = data.getBrowseButton();

browse.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent evt){
        //Some code                 
    }
});
data.setBrowseButton(browse);seButton(browse);

但即使这样也不是正确的方法。

那么有人知道如何从另一个类向Button添加ActionListener吗? 谢谢:))

2 个答案:

答案 0 :(得分:2)

要在单独的线程中执行按钮操作,请不要将动作侦听器的创建放入方法运行中,将要执行的操作放在方法运行中。

  1. 从PanelActions中删除任何runnable:

    public class PanelActions {
    GUIdata data = new GUIdata();
    
    
    //submitButton 
    data.getSubmitButton().addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent evt) {
              //Some code
        }           
    }); 
    
    //Browse Button
    data.getBrowseButton().addActionListener(new ActionListener(){      
        @Override
        public void actionPerformed(ActionEvent evt) {
              //Some code
        }           
    }); 
    }  
    
  2. 在actionPerformed中创建一个Runnable或Thread并开始执行

    @Override
    public void actionPerformed(ActionEvent evt) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                //Some code
            }
        };
        thread.start();
    }
    

答案 1 :(得分:0)

"Update progressbar"给我的印象是您可能需要invokeLater

    data.getBrowseButton().addActionListener(new ActionListener(){      
        @Override
        public void actionPerformed(ActionEvent evt) {
            EventQueue.invokeLater(new Runnable() {
                //Some code
            });
        }           
    }); 

这使事件处理线程处理按钮单击(actionPerformed)。只是稍后代码执行并响应,重新绘制进度条。

另一种软件设计可能更清晰。您可以使用Action(扩展AbstractAction)。做一些动作并将它们放入JButtons。