0

Java Swing GUI 用のクリーンで OOP コードを作成しようとしています。そこで、Runnable を実装し、すべてのアクションを処理するクラスを作成しました。ゲッターとセッターでいっぱいのデータクラスに保存したすべてのデータとコンポーネント。

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

ゲッターとセッタークラス:

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

しかし、この方法では、実行されるアクションのコードは機能しません。スレッドが開始され、run メソッドがうまく機能しています。しかし、おそらくActionListenerget メソッドに を追加するのは好きではありません。私もこれを試しました:

JButton browse = data.getBrowseButton();

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

しかし、それも正しい方法ではありません。

別のクラスからボタンに ActionListener を追加する方法を知っている人はいますか? ありがとう :)

4

2 に答える 2

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 に答える