我正在尝试使用框架在java中创建一个简单的聊天程序。用户可以托管服务器(通过单击服务器按钮)或作为客户端连接(使用连接按钮)。我遇到的问题是服务器按钮。我的目标是,当单击“启动服务器”按钮时,将禁用所有其他按钮和字段,并且应运行startServer方法。
整个程序在while (!kill)
循环内部,现在,它只是检查isServer布尔值。
while (!kill)
{
if (isServer)
{
startServer();
}
}
按下startServerButton时,isServer在actionPerformed内设置为true。
我的问题是startServer()永远不会运行,因为while(!kill)循环在单击startServerButton时没有获得更新的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()
来创建框架布局。我不是100%确定这是多么有效。
答案 0 :(得分:2)
在这一行:if (isServer)
如果单击按钮if (isServer == true)
设置为true,您的意思是说isServer
吗?
根据我的经验"if" statements
应始终有条件,例如if (variable1.equals(variable2))
或if (boolean == true)
。
或者问题可能在你的while(!kill)循环中。在这种情况下,只需取出if语句,然后查看该方法是否运行。
答案 1 :(得分:1)
Java中的Volatile用作Java编译器和Thread的指示符,不缓存此变量的值,并始终从主内存中读取它。因此,如果您想通过实现共享任何读取和写入操作都是原子的变量,例如读取和写入int或boolean变量,可以将它们声明为volatile变量。
这是一个链接: