0

フレームを使用して、Javaで簡単なチャットプログラムを作成しようとしています。ユーザーは、サーバーをホストする(サーバーボタンをクリックする)か、クライアントとして接続する(接続ボタンを使用する)ことができます。私が抱えている問題はサーバーボタンです。私の目標は、[サーバーの開始]ボタンをクリックすると、他のすべてのボタンとフィールドが無効になり、startServerメソッドが実行されるようにすることです。

プログラム全体がwhile (!kill)ループ内にあり、現在、isServerブール値をチェックしているだけです。

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

startServerButtonが押されると、actionPerformed内でisServerがtrueに設定されます。

私の問題は、startServerButtonがクリックされたときにwhile(!kill)ループが更新されたisServer値を取得しないため、startServer()が実行されないことです。

これが私のrunメソッドです:

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

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

}

これが私のactionPerformedです:

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()これがどれほど効果的かは100%わかりません。

4

2 に答える 2

2

この行で:if (isServer)

if (isServer == true)ボタンがクリックされたときisServerにtrueに設定されているかどうかを言うことを意味しますか?

私の経験では、たとえば、など"if" statementsの条件が常にあるはずです。if (variable1.equals(variable2))if (boolean == true)

または、while(!kill)ループに問題がある可能性があります。その場合は、ifステートメントを取り出して、メソッドが実行されるかどうかを確認してください。

于 2012-12-02T20:29:40.230 に答える
1

Javaの揮発性キーワードは、この変数の値をキャッシュせず、常にメインメモリから読み取るJavaコンパイラおよびスレッドへのインジケータとして使用されます。したがって、読み取りおよび書き込み操作が実装によってアトミックである変数を共有する場合、たとえば、intまたはブール変数での読み取りおよび書き込みを行う場合は、それらを揮発性変数として宣言できます。

ここにリンクがあります:

揮発性についての説明

于 2012-12-02T20:30:33.333 に答える