0

ボタンがクリックされるたびに、メインが(ポップアップダイアログボックスで)こんにちはを出力する必要があります。そのため、次のプログラムを設計しましたが、動作しないようです。プログラムは問題なくコンパイルおよび実行されますが、ボタンをクリックしても、ダイアログ ボックスが表示されません。main() ブロックで値がテストされているブール変数 (button_clicked) のゲッターとセッターを配置しました。わかる方教えてください..

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class abc extends JFrame implements ActionListener{

boolean button_clicked = false;
JButton b1;

abc(){
    this.setSize (400, 400);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.createUI();
}

void createUI(){
    this.setLayout(null);
    b1 = new JButton("x");
    b1.setSize(110,30);
    b1.setLocation(10,210);
    this.add(b1);

    b1.addActionListener(this);
}

public boolean isButton_clicked() {
    return button_clicked;
}

public void setButton_clicked(boolean button_clicked) {
    this.button_clicked = button_clicked;
}


public void actionPerformed(ActionEvent arg0) {
    button_clicked = true;

    //I don't want to print the dialogue box from here..
    //I want to keep everything under main()'s control.
}

}


public class tempMain extends JFrame {

public static void main(String[] args) {
    abc temp = new abc();
    temp.setVisible(true);
    while(true){
        if(temp.isButton_clicked())
            JOptionPane.showMessageDialog(null, "Hello");
    }
}

}
4

6 に答える 6

3

JOptionPane.showMessageDialog()呼び出しをメソッドの下に移動し、メソッドの下のものactionPerformed()を削除します。while()main

于 2012-08-29T17:19:07.580 に答える
2

@Quinman が指摘したように、コード設計には本当に欠陥があります。私には理解できない個人的な理由で JOptionPane を actionperformed メソッドの下に置きたくないということは理解しています。その前提に基づいて、コールバックを作成する、つまり、JFrame にメイン クラスを認識させ、ボタンがクリックされたときにそれを呼び出すことが最善の解決策になると思います。

このメカニズムをメインクラスから独立させることができます。その方法を理解するには 、オブザーバーの設計パターンを確認してください。

コードには別の欠陥もあります。ボタンをクリックすると、Hello メッセージが無限に表示されます。これを回避するには、button_clicked 変数を false に設定する必要があります。一般的なヒントとして、実際には、あなたの while が引き起こしている忙しい待ち時間を本当に取り除くべきです.

于 2012-08-29T17:28:10.470 に答える
2

コードにを実装するのに役立つ「アクション リスナーの作成方法」を参照してください。ActionListner

コードの基本的な考え方は次のとおりです。

  • イベント ハンドラー クラスを宣言する
  • イベント ハンドラー クラスのインスタンスをリスナーとして登録します。JButton
  • メソッドを実装するコードをリスナー インターフェイスに含めます。あなたの場合、actionPerformed()ダイアログボックスを表示するためにロジックをオーバーライドしてそこに記述します。「ダイアログの作成方法」は、もう 1 つの役立つチュートリアルです。
于 2012-08-29T17:23:40.517 に答える
2

モードレスダイアログを探している可能性があります。このでは、 という名前のメイン パネルが、ダイアログでObserverをリッスンしObservedPanelます。を使用するPropertyChangeListenerと、ダイアログに加えた変更がすぐにメイン パネルに反映されます。

于 2012-08-29T18:03:26.123 に答える
2

すでに多くの人が指摘しているように、あなたのアプローチとデザインには欠陥があります。すでに対処済みなので、これ以上は説明しませんが、提案として試してみてください...

abc temp = new abc();
temp.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        JOptionPane.showMessageDialog(null, "Look Ma, I'm in Main...");
    }
});
temp.setVisible(true);

そしてあなたのabcクラスでは...

class abc JFrame implements {
    // build your class as normal

    public void addActionListener(ActionListener listener) {
        b1.addActionListener(listener);
    }    
}
于 2012-08-29T23:42:31.703 に答える
0

あなたが提供したコメントから判断するとabc、いくつかの異なる目的のためにあなたのクラス(非常に貧弱な名前を持ち、Java命名基準に準拠していない)を再利用したいので、あなたが押したときに実行されるコードを含めたくないabcクラスのボタン。

これには複数の解決策があります(最初の解決策が私の好みです)

  • クラスActionのコンストラクターに を渡し、それを. このように、インスタンスを構築するクラスは、ボタンが押されたときの動作を担当しますabcActionJButtonabc
  • abc抽象化し、ActionListenerその抽象メソッドを呼び出すようにします。その後、異なる動作が必要になるたびに、このクラスの具体的な実装を作成できます。

コードに関するその他の注意事項:

  • while( true )そのループを取り除く
  • nullレイアウトを取り除き、LayoutManager代わりにa を使用する
  • Swing コンポーネントはEvent Dispatch Threadで作成およびアクセスする必要があります。詳細については、Swing の同時実行のチュートリアルを参照してください。
于 2012-08-30T08:34:26.990 に答える