2012-03-31 10 views
0

クラスAでボタンをクリックし、クラスBで別のボタンをクリックすると、2つのイベントが組み合わされてクラスCのインスタンスが作成されるJavaで3つのクラスを作成したいと思います。 ?コメントからJavaでクラスを呼び出す

(更新:)以下

は、イベントコードです。

// There is a text area showing when it is clicked and when it 
// gets a response back from the thirdclass 
... 
buttonpanel = new JPanel(); 
getItButton = new JButton("Call ThirdClass"); 
getItButton.addActionListener (new ActionListener() { 
    public void actionPerformed (ActionEvent evt) { 
     textarea.append("Calling thirdclass...\n"); 
     String result = thirdclass.fetch_message(); 
     textarea.append(" Result = " + result + "\n\n"); 
    } 
}); 
+0

ようこそstackoverflow。 Fyiでは、独自の質問を更新して、コードや詳細を追加することができます。 (私はこのポストにイベントコードを移動してより良い視認性を実現しました) – Leigh

答えて

0

両方のボタンに同じイベントハンドラを接続します。そのハンドラでカウンタをインクリメントします。カウンタが2に達すると、クラスCのインスタンスを作成します。

+4

カウンタを使用する場合は、クラスAのボタンを2回押すことを心配する必要があります。カウンターの代わりにフラグを使用したいので、同じボタンから2つのヒットをトリガー。 – twain249

2

aClickedとの2つを初期化します。からfalseを初期化します。

ユーザーがクラスAのボタンをクリックすると、aClickedtrueに設定します。その後、次のロジック実行:ユーザーは、クラスBのボタンをクリックすると

if (aClicked && bClicked) 
{ 
    new ClassC(); 
} 
aClicked = false; 
bClicked = false; 

truebClickedに設定。その後、同じロジックを実行します。

私はより良い答えのために詳細が必要です。

EDIT:あなたのコードサンプルと匿名クラスを使用して、私は次のように書いています。私は通常JavaでGUIを書いていませんし、そうしたときにはWindowBuilderを使っています。この点はおそらくスレッドセーフではなく、リソースを適切にクリーンアップできないかもしれないが、finalキーワードを使用して匿名クラス内の変数booleanを参照するという概念を示すことが重要である。

これは私のために働いた。それがあなたを助けないなら、私はあなたのコードをもっと必要とします。

また、Stateクラスのロジックが複雑になる場合は、Jake Greeneが推奨するFSMアプローチをお勧めします。

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 

public class Main { 
    public static void main(String[] args) { 
     final State state = new State(); 

     final JTextArea textArea = new JTextArea(1, 10); 
     textArea.setEditable(false); 

     JButton buttonA = new JButton("Button A"); 
     buttonA.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       state.clickA(); 
       if (state.bothClicked()) { 
        textArea.setText("both clicked."); 
       } 
      } 
     }); 

     JButton buttonB = new JButton("Button B"); 
     buttonB.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       state.clickB(); 
       if (state.bothClicked()) { 
        textArea.setText("both clicked."); 
       } 
      } 
     }); 

     JButton reset = new JButton("Reset!"); 
     reset.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       state.reset(); 
       textArea.setText(""); 
      } 
     }); 

     JPanel pane = new JPanel(); 
     pane.add(buttonA); 
     pane.add(buttonB); 
     pane.add(textArea); 
     pane.add(reset); 

     JFrame frame = new JFrame(); 
     frame.setContentPane(pane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class State { 
    private boolean aClicked; 
    private boolean bClicked; 

    public void clickA() { 
     this.aClicked = true; 
    } 

    public void reset() { 
     this.aClicked = false; 
     this.bClicked = false; 
    } 

    public void clickB() { 
     this.bClicked = true; 
    } 

    public boolean bothClicked() { 
     return this.aClicked && this.bClicked; 
    } 
} 
+0

ありがとう、以下はイベントコードですが、クリックイベントをブール値に変更するにはどうすればよいですか。 buttonpanel = new JPanel(); \t getItButton = new JButton( "Call ThirdClass"); \t getItButton.addActionListener(新しいのActionListener(){ \t \tます。public void actionPerformedの(のActionEvent EVT){ \t \t \t textarea.append( "thirdclassを呼び出す... \ N"); \t \t \t文字列の結果= thirdclass。 fetch_message(); \t \t \t textarea。追加( "結果=" +結果+ "\ n \ n"); \t \t} \t \t}); \t \t //クリックされた時点と3番目のクラスから応答が返ってきたときに表示されるテキスト領域があります –

1

アプリケーションに応じて、あなたはFinite State Machineの作成を検討することを望むかもしれません。BothPressedが

  • BPressed
  • をAPressed
  • を待っ

    1. here

      を説明するように、あなたの与えられた例えばステートマシンは4つの状態を持つことができ、列挙型を使用してJavaで簡単なステートマシンを構築することができます

    待機中に2つの遷移があります。

    • buttonAが押された場合、buttonBが押された場合APressed
    • への遷移、BPressedへ遷移

    APressedは一つの遷移があります

    • buttonBが押された場合、遷移BothPressed

    1つの遷移:

    • buttonAが押された場合、BothPressed
    • へ遷移

    BothPressed一の遷移有する:

    • 直後CのインスタンスがBothPressedある瞬間に作成され

    を待機への移行を到達した。

    ご覧のとおり、ステートマシンには多くのオーバーヘッドが必要です。アプリケーションのロジックがはるかに複雑になるのを見ていない限り、私は論理的なアプローチをお勧めします。

  • 関連する問題