我正在尝试构建一个简单的tictactoe网络游戏。我需要该节目等待,直到一名球员进行动作,然后继续。在我的代码底部的whileConnected()函数中,我有一个while(true)循环,它应该永远运行,并在按下按钮时显示一条确认消息(这是通过字符串的内容变量'消息'的变化)。暂停并等待按钮被点击,然后继续
的问题是,即使单击按钮时字符串消息变量的变化,我的whileConnected()函数从不认识到这一点,并在函数内部的if语句永远计算为真。 ButtonListener类中的相同if语句正常工作并显示所需的确认消息。
我该如何解决这个问题?我已阅读和阅读,并得到了我应该使用线程的想法(我阅读了它们,但之前从未使用它们,这就是为什么它只是一个猜测)。我需要线程吗?有人能简单地解释应该用于这个特定问题的原则吗? (如何让程序暂停,直到点击按钮,然后继续使用点击按钮时创建的相关信息)。一个代码示例会真正减轻我对线程的阅读 - 当一个人是初学者时,这是一个非常抽象的主题。
下面是我的代码,在此先感谢。
public class Test extends JFrame
{
private Container contentPane;
private JButton btn00;
private static String message = "";
private class ButtonListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
String buttonText = e.getActionCommand();
if (buttonText.equals("My Button"))
{
message = "pressed";
if (message != "")
System.out.println(message+"(executed by ButtonListener)");
}
}
}
public Test()
{
this.contentPane = this.getContentPane();
btn00 = new JButton("My Button");
btn00.setSize(btn00.getPreferredSize());
btn00.setLocation(20,20);
ButtonListener listener = new ButtonListener();
btn00.addActionListener(listener);
// configure frame
this.setSize(300,300);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// make panel
JPanel panel = new JPanel();
panel.setSize(200,200);
panel.setLocation(10,10);
panel.add(btn00);
this.contentPane.add(panel);
}
public static void main(String[] args)
{
Test gui = new Test();
gui.setVisible(true);
// connected
whileConnected();
}
private static void whileConnected()
{
System.out.println("message is at first empty: "+message);
while (true)
{
// the if below never evaluates to true... why?
if (message != "") // this is never true
System.out.println(message+"(executed by whileConnected)");
}
}
}
“如果你能通过使用结构良好的听众获得大部分或全部想要的东西,我不会感到惊讶。你能详细解释一下吗? (我很欣赏信号量的细节,但现在对我来说太复杂了,这是一个我很快就需要解决的学校项目,所以我现在很乐意去寻求最简单的解决方案) – 2013-03-27 20:12:46
就像你需要的是一些能够对按钮进行适当反应的东西。你有一个按钮监听器,它执行基于按钮按下的代码。而不是在主函数中执行任何事情,你可以在监听器中完成你需要做的所有事情。请注意,听众与用户界面运行的线程相同,因此,如果有很多处理过程,那么您可能会遇到一些令人不快的放缓,但它应该起作用。不幸的是,如果你的问题标题是你的任务的直接引用,信号量可能是他们正在寻找的。 – 2013-03-27 20:16:40
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html在这里可能会有所帮助,如果您确实需要使用信号量。 – 2013-03-27 20:20:54