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


但是这种方式执行的代码无法正常工作。线程启动,运行方法运行良好。但是可能不喜欢将ActionListener添加到get方法中。即使我尝试了这个:

JButton browse = data.getBrowseButton();

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


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

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

最佳答案

要在单独的线程中执行按钮动作,请勿将动作侦听器的创建置于方法运行中,而要将要执行的动作置于方法运行中。


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

在actionPerformed中创建一个Runnable或Thread并开始执行

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

09-04 14:23
查看更多