Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消按钮后的GUI冻结_Java_Swing_Sockets_Jbutton - Fatal编程技术网

Java 取消按钮后的GUI冻结

Java 取消按钮后的GUI冻结,java,swing,sockets,jbutton,Java,Swing,Sockets,Jbutton,我有一个gui服务器,它首先调用joptionpanel来输入端口号。。如果我点击OK按钮,它看起来运行良好。但是如果在第一次运行中我单击取消,然后单击确定我的GUI冻结。我认为classstart()让它冻结 很抱歉,这是一个重复的问题,但问题可能与其他问题不同 这是我的服务器代码。任何人都可以帮助我。究竟是什么导致gui冻结 public class server { // Main meathod public static void main(String[] args)

我有一个gui服务器,它首先调用joptionpanel来输入端口号。。如果我点击OK按钮,它看起来运行良好。但是如果在第一次运行中我单击取消,然后单击确定我的GUI冻结。我认为class
start()
让它冻结

很抱歉,这是一个重复的问题,但问题可能与其他问题不同

这是我的服务器代码。任何人都可以帮助我。究竟是什么导致gui冻结

public class server {
    // Main meathod
    public static void main(String[] args) {
        try {
    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        server server2 = new server(PORT);
        server2.start();    
    }

public server(int PORT)
{
    sdf = new SimpleDateFormat("[HH:mm:ss]");
    go();
}

public void go() {

   //The GUI hidden`enter code here`...
    connect.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            // When Exit button is pressed
            if (ae.getSource() == connect) {
                start();
        }
        }
    });
}

// Add new threads when new user enters
class reader implements Runnable {
    BufferedReader br;

    public reader(Socket clientsocket) {
        try {
            sock = clientsocket;

            // Getting input stream
            InputStreamReader ir = new InputStreamReader(
                    sock.getInputStream());
            br = new BufferedReader(ir);
        } catch (IOException ex) {
            info.append(ex + "\n");
        }
    }

    @Override
    public void run() {
         String msg = null;
            String n;
            try{                    
                InputStreamReader ir = new InputStreamReader(sock.getInputStream());
                br = new BufferedReader(ir);
                pw = new PrintWriter(sock.getOutputStream());

                // If message is not empty then broadcast message
                while((msg=br.readLine())!=null)
                {

                     incoming.append(msg +"\n");                
                     pw.println(); // send the same line back to the client.
                     pw.flush(); // flush the stream to ensure that the data reaches the other end.
                }
            }
            catch(SocketException ex)
            {
                info.append("Client Disconnected.\n");
            }
            catch(IOException ex)
            {
                info.append(ex+"\n");
            }
        }
    }

private static int setPortNumber()
{
    String portNumber = (String) JOptionPane.showInputDialog(frame,
            "Enter the Port number for server creation","Server Connection\n",
            JOptionPane.OK_CANCEL_OPTION, null, null, PORT);

    int PORT = Integer.parseInt(portNumber);

    return PORT;

}   

// Meathod to handle networking Activities
public void start(){
    connected = new ArrayList<PrintWriter>();
    try {
        PORT = setPortNumber();
        ss = new ServerSocket(PORT);
        String time = sdf.format(new Date());
            info.append(time + "Server Started at port : " + PORT + "\n");                  
        keep = true;
        while (keep) {
            try {
                // Get socket connection
                Socket clientsocket = ss.accept();
                InetAddress a = clientsocket.getInetAddress();
                info.append(a.getHostName() + " at IP Address "
                        + a.getHostAddress() + " Connected to server.\n");

                // Get output steam
                PrintWriter pw = new PrintWriter(
                        clientsocket.getOutputStream());
                connected.add(pw);
                // Create and start new thread
                Thread t1 = new Thread(new reader(clientsocket));
                t1.start();

            }

            catch (NullPointerException ex) {
                info.append("Null pointer Exception ");
            } catch (SocketException e) {
                info.append("Connection Reset\n");
            }
        }
    } catch (Exception ex) {
        info.append("Server has not been connected! Please try again, click connect button.\n");        
    }   
}
公共类服务器{
//主要方法
公共静态void main(字符串[]args){
试一试{
UIManager.setLookAndFeel(“javax.swing.plaf.nimbus.NimbusLookAndFeel”);
}捕获(可丢弃的e){
e、 printStackTrace();
}
服务器server2=新服务器(端口);
server2.start();
}
公共服务器(int端口)
{
sdf=新的简化格式(“[HH:mm:ss]”);
go();
}
公开作废go(){
//GUI隐藏了“在此处输入代码”。。。
connect.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
//当按下退出按钮时
如果(ae.getSource()==connect){
start();
}
}
});
}
//当新用户进入时添加新线程
类读取器实现可运行{
缓冲剂;
公共读取器(套接字客户端套接字){
试一试{
sock=clientsocket;
//获取输入流
InputStreamReader ir=新的InputStreamReader(
getInputStream());
br=新的缓冲读取器(ir);
}捕获(IOEX异常){
信息附加(ex+“\n”);
}
}
@凌驾
公开募捐{
字符串msg=null;
字符串n;
试试{
InputStreamReader ir=新的InputStreamReader(sock.getInputStream());
br=新的缓冲读取器(ir);
pw=新的PrintWriter(sock.getOutputStream());
//如果消息不为空,则广播消息
而((msg=br.readLine())!=null)
{
传入的.append(msg+“\n”);
pw.println();//将同一行发送回客户端。
pw.flush();//刷新流以确保数据到达另一端。
}
}
捕获(SocketException例外)
{
info.append(“客户端已断开连接。\n”);
}
捕获(IOEX异常)
{
信息附加(ex+“\n”);
}
}
}
私有静态int setPortNumber()
{
字符串端口号=(字符串)作业窗格。showInputDialog(框架,
“输入用于创建服务器的端口号”“服务器连接\n”,
JOptionPane.OK\u CANCEL\u选项,null,null,PORT);
int PORT=Integer.parseInt(端口号);
返回端口;
}   
//处理网络活动的方法
公开作废开始(){
已连接=新的ArrayList();
试一试{
端口=设置端口号();
ss=新服务器套接字(端口);
字符串时间=sdf.format(newdate());
info.append(时间+”服务器在端口:“+端口+”\n”)启动;
保持真实;
同时(保持){
试一试{
//获取套接字连接
Socket clientsocket=ss.accept();
InetAddress a=clientsocket.getInetAddress();
info.append(a.getHostName()+“在IP地址”
+a.getHostAddress()+“已连接到服务器。\n”);
//获得输出蒸汽
PrintWriter pw=新的PrintWriter(
getOutputStream());
已连接。添加(pw);
//创建并启动新线程
线程t1=新线程(新读卡器(clientsocket));
t1.start();
}
捕获(NullPointerException ex){
追加(“空指针异常”);
}捕获(SocketException e){
info.append(“连接重置\n”);
}
}
}捕获(例外情况除外){
info.append(“服务器尚未连接!请重试,单击“连接”按钮。\n”);
}   
}

您的start方法最终会调用一个阻止Swing事件线程的
while(true)
循环。解决方案是在后台线程中执行此长时间运行的代码,一种体面的方法是使用
SwingWorker
。有关此有用构造的更多详细信息,请参阅


重要的一点是:您需要改进代码格式,特别是代码缩进。当前的缩进有误导性,因为您启动了一些内部类,使它们看起来像是外部类。如果您可以使用IDE,请这样做,并允许它帮助改进缩进。否则,请手动执行小心,因为好的缩进可以帮助您一眼就调试代码的某些概念,而坏的缩进可能会误导您和其他人对代码的看法。

您的start方法最终会调用
while(true)
阻止Swing事件线程的循环。解决方案是在后台线程中执行此长时间运行的代码,一种体面的方法是使用
SwingWorker
。有关此有用构造的更多详细信息,请参阅


重要的一点是:您需要改进代码格式,特别是代码缩进。当前的缩进有误导性,因为您启动了一些内部类,使它们看起来像是外部类。如果您可以使用IDE,请这样做,并允许它帮助改进缩进。否则,请手动执行小心,因为好的缩进可以帮助您一眼就调试代码的某些概念,而坏的缩进可能会误导您和其他人对代码的看法。

正如HovercraftFullOfEels所说,您的while()应该位于单独的线程中,