我有一个使用JOptionPane来引起用户猜测的刽子手引擎,但是现在我正在实现一个带有文本字段的GUI,我需要一种方法来阻止引擎并让用户从文本字段中猜出 - 我我试图使用MVC所以当前来自文本字段的数据被发送到主/控制器类但是在将数据加载到主类中的变量之后 - 我开始无法将这些数据集成到引擎中
我不知道在发动机上添加等待是否是最好的事情,但这是我能想到的全部。
这是我的引擎类:
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");
}
我此刻真的迷失了,所以即使是朝正确方向点头也会有所帮助:)
答案 0 :(得分:4)
通常可以使用wait/notify
内置java机制来实现等待。
虽然你可以找到一堆解释这个问题的教程,但这是一个非常简短的解释。
java中的每个类都自动扩展java.lang.Object
,定义方法wait()
和notify()
。等待挂起当前线程,直到在同一对象上调用notify()
。用于调用wait()
和notify()
的对象称为 monitor 。遵循java线程管理规则,必须从synchronized
块调用这两个方法,即
synchronized(obj) {
obj.wait();
}
现在你的问题的答案很简单。定义从两个点可见的监视器对象(我的意思是应该等待的代码和应该触发第一个线程继续的代码)。
实施等待:
synchronized(obj) {
obj.wait();
}
当使用点击按钮(因此您希望等待退出)时,您应该调用代码:
synchronized(obj) {
obj.notify();
}
就是这样。请注意,wait
的版本超时,并且notifyAll()
也有{{1}}。恕我直言需要一些时间来学习java线程,同步等等。这很有趣。祝好运。