我正在学习 Java,我尝试制作一个简单的客户端-服务器应用程序。我的服务器有 GUI 和一个启动服务器的按钮。单击后,另一个线程将启动。我将其称为主服务器线程,因为它处理连接并处理客户端。我还有关闭服务器的按钮,但不是整个应用程序。我关闭 ServerSocket 以中断该线程,以便我可以停止服务器。我希望弹出消息对话框 inf finally block 来通知我服务器停止运行。 这是服务器 run 方法的一些简化和修改的代码:
public void run(){
try{
JOptionPane.showMessageDialog(null,"begining");
ss = new ServerSocket(TCP_PORT);
while(cont){
Socket sock = ss.accept();
exec.execute(new ServerThread(sock));
}catch(SocketException soex){
//JOptionPane.showMessageDialog(null,"SocketException");
}finally{
JOptionPane.showMessageDialog(null,"finally");
}
//JOptionPane.showMessageDialog(null,"after finally");
}
第一个消息对话框显示正确,但是当其他 3 个对话框中的一些由于异常而弹出时,我只得到带有标题和窗口边框的灰色消息对话框,但没有消息或任何按钮。我无法关闭它,我无法关闭我的应用程序。它卡在那里。
我使用的是Ubuntu,它使用open-jdk javac版本“1.7.0_25”编译,并使用相同版本的java运行它。我还尝试了版本1.6,以及Oracle 1.7.0_25(java和javac)。每次我都会得到相同的结果。
这里有什么问题,我该如何解决?
最佳答案
您的问题是 Concurency in Swing ,所有更新 must be done on EDT
全部Top-Level Containers必须在Initial Thread上创建,对其衍生物有效 ( JOptionPane is derivate from JDialog )
参见here is demonstrations of your issue ,那么应用程序是 TaskManager 的候选者(仅可能被杀死)
关于java - 抛出异常后的空白消息对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250004/