0

我正在尝试为 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;
    }
}

但是这种方式执行的操作中的代码不起作用。线程启动并且运行方法运行良好。但可能它不喜欢在ActionListenerget 方法中添加一个。即使我试过这个:

JButton browse = data.getBrowseButton();

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

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

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

4

2 回答 2

2

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

  1. 从 PanelActions 中删除任何可运行的:

    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();
    }
    
于 2013-10-25T13:38:54.883 回答
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 中。

于 2013-10-25T13:41:37.070 回答