2012-03-31 59 views
0

我想在Java中編寫三個類,其中當在A類中單擊按鈕並在B類中單擊另一個按鈕時,組合的兩個事件會創建類C的實例。我該如何解決這個問題?在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 2012-03-31 22:14:02

回答

0

將兩個按鈕附加相同的事件處理程序。在那個處理器中增加一個計數器當計數器達到2創建C.類

+4

如果你使用計數器,你必須擔心兩次敲擊A類按鈕,以及你如何處理,所以你可能想用標誌來代替計數器,不會觸發來自同一按鈕的兩次命中。 – twain249 2012-03-31 03:02:45

2

初始化2個boolean變量aClickedbClickedfalse的實例。

當用戶單擊A級按鈕時,將aClicked設置爲true。然後執行以下邏輯:

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

當用戶點擊在類B的按鈕,設置bClickedtrue。然後執行相同的邏輯。

我需要更多的細節纔能有更好的答案。

編輯:鑑於你的代碼示例和使用匿名類,我寫了以下內容。我通常不用Java編寫GUI,而當我這樣做時,就是使用WindowBuilder。這可能不是線程安全的,並且可能無法正確清理資源,但重點是要演示使用final關鍵字在匿名類中引用boolean變量的概念。

這對我有效。如果它不能幫助你,我將需要更多的代碼。

此外,對於State類,如果您的邏輯變得更復雜,我會推薦由傑克格林推薦的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

謝謝,以下是事件代碼,但我該如何將click事件更改爲布爾值。 buttonpanel = new JPanel(); \t getItButton = new JButton(「Call ThirdClass」); \t getItButton.addActionListener(新的ActionListener(){ \t \t公共無效的actionPerformed(ActionEvent的EVT){ \t \t \t textarea.append( 「調用三級欄目... \ n」); \t \t \t字符串結果=三級欄目。 fetch_message(); \t \t \t textarea。append(「Result =」+ result +「\ n \ n」); \t \t} \t \t}); \t \t //有一個文本區域顯示它何時被點擊以及何時從第三類獲得響應 – 2012-03-31 11:52:04

1

根據不同的應用程序,您不妨考慮創建一個Finite State Machine。您可以使用枚舉在Java中建立一個簡單的狀態機,如描述here

狀態機爲您給出的例子可以有4種狀態:

  1. 等待
  2. APressed
  3. BPressed
  4. BothPressed

等待有兩個轉換:

  • 如果按鈕a被按下,過渡到APressed
  • 如果按下buttonB,過渡到BPressed

APressed具有一個過渡:

  • 如果buttonB被按下,過渡到BothPressed

BPressed有一個轉換:

  • 如果按下按鈕a,過渡到BothPressed

BothPressed有一個過渡:

  • 立即轉換到等待

C的實例被創建的那一刻BothPressed是到達。

正如您所見,狀態機需要大量的開銷。除非你看到你的應用程序的邏輯變得更加複雜,否則我會推薦布爾方法。