2013-08-27 67 views
1

我有一个hangman引擎,它使用JOptionPane来获取用户的猜测,但现在我正在实现一个带有文本字段的GUI,我需要一种方法来停止引擎并从文本字段中获取用户猜测 - 我试图使用MVC,因此目前来自文本字段的数据被发送到主/控制器类,但是在数据加载到主类中的变量之后 - 我开始无法将这些数据整合到引擎中可以一个while循环等待事件继续java

我不知道给引擎添加一个等待是否是最好的事情,但这是我真正想到的。

这里是我的引擎类:

public class engine { 
    char [] charda = new char[20]; 
    char [] charwo = new char[20]; 
    Highscore words = new Highscore(); 
    main mn = new main(); 
    int guesses =7; 
    char guess; 

    public engine() { 
    } 

    public void enginer(){ 

     int count = 0; 
     String word = words.getWord(); 

     for (int i = 0; i<word.length(); i++) 
     { 
      //instantiates two arrays one of dahses and one with the word 
      charwo[count] = word.charAt(i); 
      charda[count]= '_'; 
      count++; 
     } 

     for (int l=0; l<count; l++) 
     { 
      System.out.print(" "+charda[l]); 
     } 

     while (guesses != 0 && !Arrays.equals(charwo, charda)) 
     { 
      System.out.println(""); 
      guess = JOptionPane.showInputDialog("enter a Guess").charAt(0); 

      if (word.toUpperCase().contains(String.valueOf(guess).toUpperCase())) 
      { 
       for (int k = 0; k<word.length(); k++) 
       { 
        if (String.valueOf(guess) 
          .toUpperCase() 
          .equals(String.valueOf(charwo[k]).toUpperCase())) 
        { 
         charda[k]=charwo[k]; 

         for(int l=0; l<count; l++) 
         { // prints dashes here to avoid a letter being 
          // chopped off by the program stopping in the middle 
          System.out.print(" "+charda[l]); 

         } 
        } 
       } 
      } 
      else 
      { 
       guesses = guesses-1; 
       System.out.println("guesses left "+guesses); 
       // 
       //Re-displays dashes 
       for (int l=0; l<count; l++) 
       { 
        System.out.print(" "+charda[l]); 
       } 
      } 

      if (Arrays.equals(charwo, charda)) 
      { 
       System.out.println(""); 
       System.out.println("You are Winner"); 

      } 
     } 
    } 
} 

这里是处理我的主类的部分按钮点击

public void buttonClicked() 
{ 
    gameplay gp = new gameplay(); 
    engine en = new engine(); 

    en.guess = gp.getInput; // this is where I try send the input from the text field to the engine 
    en.enginer(); 

    System.out.println("button clicked"); 
} 

我真的失去了此刻所以即使是在点头正确的方向将是真正有帮助:)

+1

请参阅观察者和听众设计模式。这是你需要的。 –

回答

4

通常可以使用内置的java机制wait/notify执行等待。

尽管你可以在这里找到一大堆解释这个问题的教程,但这只是一个非常简单的解释。

java中的每个类都自动扩展java.lang.Object,它定义了方法wait()notify()。等待暂停当前线程,直到在同一对象上调用notify()。用于调用wait()notify()的对象称为监视器。下面的Java线程管理的规则,既方法必须从​​块被调用,即

synchronized(obj) { 
    obj.wait(); 
} 

现在回答你的问题很简单。定义从两个点都可见的监视器对象(我的意思是应该等待的代码以及应该触发第一个线程继续的代码)。

实施等着为:

synchronized(obj) { 
    obj.wait(); 
} 

使用时点击按钮(所以你要等待退出),你应该调用代码:

synchronized(obj) { 
    obj.notify(); 
} 

就是这样。请注意0​​的版本有超时,并且也有notifyAll()。恕我直言,需要一些时间来学习Java线程,同步等。这很有趣。祝你好运。

+0

哇,这太棒了,我一定会更深入地了解这一点。我对一件事感到困惑,但是如果告诉对象等待,那么程序将如何继续,因为等待将迫使两个锁等待,因此如果另一个锁正在等待,它将如何通知? – nmu