0

我正在尝试使用框架在 java 中创建一个简单的聊天程序。用户可以托管服务器(通过单击服务器按钮)或作为客户端连接(使用连接按钮)。我遇到的问题是服务器按钮。我的目标是,当单击 Start server 按钮时,所有其他按钮和字段都被禁用,并且 startServer 方法应该运行。

整个程序在一个while (!kill)循环中,现在,它只是检查 isServer 布尔值。

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

当 startServerButton 被按下时,isServer 在 actionPerformed 内部设置为 true。

我的问题是 startServer() 永远不会运行,因为当单击 startServerButton 时,while (!kill) 循环没有获得更新的 isServer 值。

这是我的运行方法:

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 中的 Volatile 关键字用作 Java 编译器和线程的指示符,它们不缓存此变量的值并始终从主内存中读取它。因此,如果您想通过实现共享读取和写入操作是原子操作的任何变量,例如在 int 或布尔变量中读取和写入,您可以将它们声明为 volatile 变量。

这是一个链接:

关于易失性的解释

于 2012-12-02T20:30:33.333 回答