簡體   English   中英

循環未從actionPerformed中獲取更新的布爾值

[英]Loop isn't getting updated boolean value from actionPerformed in java

我正在嘗試使用框架在Java中創建一個簡單的聊天程序。 用戶可以托管服務器(通過單擊服務器按鈕),也可以作為客戶端連接(使用連接按鈕)。 我遇到的問題是服務器按鈕。 我的目標是,當單擊“啟動服務器”按鈕時,所有其他按鈕和字段都被禁用,並且startServer方法應該運行。

整個程序處於while (!kill)循環中,而現在,它只是檢查isServer布爾值。

    while (!kill)
    {
        if (isServer)
        {
            startServer();
        }
    }

在按下startServerButton時,在actionPerformed中將isServer設置為true。

我的問題是startServer()永遠不會運行,因為單擊startServerButton時while(!kill)循環未獲取更新的isServer值。

這是我的運行方法:

public void run()
{   
    conversationBox.appendText("Session Start.\n");
    inputBox.requestFocus();

    while (!kill)
    {
        if (isServer)
        {
            startServer();
        }
    }       

}

這是我執行的動作:

public void actionPerformed(ActionEvent e) throws NumberFormatException
{
    Object o = e.getSource();

    if (o == sendButton || o == inputBox)
    {
        if(inputBox.getText() != "")
        {
            clientSendMsg = inputBox.getText();
            inputBox.setText("");
        }
    }
    if (o == changeHost || o == hostField)
    {
        if (hostField.getText() != "" && hostField.getText() != host)
        {
            host = hostField.getText();
            conversationBox.appendText("Host changed to " + host + "\n");
        }
    }
    if (o == changePort || o == portField)
    {
        if (portField.getText() != "" && Integer.valueOf(portField.getText()) != port)
        {
            try
            {
                port = Integer.valueOf(portField.getText());
                conversationBox.appendText("Port changed to " + port + "\n");
            }
            catch(NumberFormatException up)
            {
                throw up; //blargh enter a real value
            }
        }
    }
    if (o == startServerButton)
    {
        isServer = true;
        startServerButton.enable(false);
        connectButton.enable(false);
        changeHost.enable(false);
        changePort.enable(false);
        sendButton.enable(false);
        hostField.enable(false);
        portField.enable(false);
        inputBox.enable(false);
    }
    inputBox.requestFocus();
}

顯然,該程序還遠未完成,但這是一個很大的障礙,可以忽略,因此我認為最好在進行之前對其進行修復。 另外,應該注意,我有一個new Thread(this).start(); 在創建框架布局的Chat()對象內部。 我不確定這有多有效。

在這一行: if (isServer)

您的意思是說if (isServer == true)如果單擊按鈕時isServer設置為true?

以我的經驗, "if" statements應始終具有條件,例如if (variable1.equals(variable2))if (boolean == true)

或問題可能出在您的while(!kill)循環中。 在這種情況下,只需取出if語句,然后查看該方法是否隨后運行。

Java中的Volatile關鍵字用作Java編譯器和Thread的指示符, 它們不緩存此變量的值,而始終從主內存中讀取它。 因此,如果您想共享實現中原子的讀寫操作所涉及的任何變量,例如int或boolean變量中的讀寫,則可以將它們聲明為volatile變量。

這里是一個鏈接:

關於揮發物的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM