我正在嘗試構建一個簡單的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