Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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在while循环中冻结_Java_Swing_User Interface_Network Programming_Concurrency - Fatal编程技术网

Java Gui在while循环中冻结

Java Gui在while循环中冻结,java,swing,user-interface,network-programming,concurrency,Java,Swing,User Interface,Network Programming,Concurrency,server.java 好的,所以问题是:当我点击开始按钮时,gui“冻结”,但服务器正在工作,我在控制台中有一个输出。我想我应该使用线程,但我不知道如何实现它=/ void Runer() throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); System.out.println("welcome into server"); while(true) {

server.java

好的,所以问题是:当我点击开始按钮时,gui“冻结”,但服务器正在工作,我在控制台中有一个输出。我想我应该使用线程,但我不知道如何实现它=/

void Runer() throws Exception
{
    ServerSocket welcomeSocket = new ServerSocket(6789);
    System.out.println("welcome into server");
    while(true)
    {

        Socket connectionSocket = welcomeSocket.accept();
        if (connectionSocket != null)
        {
            System.out.println(connectionSocket);
            Client client = new Client(connectionSocket);
            client.start();
        }
    }
}
}

gui.java

JPanel GuiServera(){
    JPanel panel = new JPanel();
    area = new JTextArea();
    area.setColumns(20);
    area.setRows(10);
    area.setText("The log is logging injoy");
    panel.setLayout(null);
    start = new JButton("Start");
    start.addActionListener(list);
    panel.add(start);
    stop = new JButton("Stop");
    stop.addActionListener(list);
    pane = new JButton("Admin Panel");
    panel.add(stop);

    panel.add(pane);
     scrolled = new JScrollPane(area);
     panel.add(scrolled);
    Insets insets = panel.getInsets();
    Dimension size = start.getPreferredSize();
    start.setBounds(40 + insets.left, 20 + insets.top,
    size.width, size.height);

    size = stop.getPreferredSize();
    stop.setBounds(40 + insets.left, 60 + insets.top,
    size.width, size.height);

    size = pane.getPreferredSize();
    pane.setBounds(40 + insets.left, 100 + insets.top,
    size.width, size.height);

    size = scrolled.getPreferredSize();
    scrolled.setBounds(160 + insets.left, 20 + insets.top,
    size.width, size.height);
    return panel;
}
class Nasluchiwacz implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==start){
            System.out.println("start");
            area.append("start button\n");
            try {
                inzServer.Runer();
            } catch (Exception ex) {
                Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        else if (e.getSource()==stop){
            area.setText(area.getText()+"\nstop\n");
        }
    }

}

你几乎做对了。 而不是延伸线程。使其实现可运行

然后在你的课堂上。您可以选择创建新线程(inserver.start();
或者看看Executorservice或Swingworkers。

你几乎做对了。 而不是延伸线程。使其实现可运行

然后在你的课堂上。您可以选择创建新线程(inserver.start();
或者看看Executorservice或swingWorker。

您应该尝试使用swingWorker。
选中此复选框,您应该尝试使用swingWorker。
检查这个

你自己已经回答了。GUI需要处理事件以响应用户交互。您需要在另一个线程上运行干扰GUI的东西来防止这种情况。这并不难,只需将代码放入可运行的实现中,然后添加新线程(Runnable).start()即可。如果您的线程需要与GUI交互,那么您需要了解InvokeLatter()和invokeAndWait(),它们在Swing的事件调度线程上排队不要这样做,学习如何使用布局(+填充和边框)。我知道如何使用布局,我只是发现绝对定位更多handy@iie:了解如何使用布局的方法是使用它们。它们确实是不可或缺的。“我知道如何使用布局,我只是觉得绝对定位更方便”——这本身就是一个矛盾;-)你自己回答的。GUI需要处理事件以响应用户交互。您需要在另一个线程上运行干扰GUI的东西来防止这种情况。这并不难,只需将代码放入可运行的实现中,然后添加新线程(Runnable).start()即可。如果您的线程需要与GUI交互,那么您需要了解InvokeLatter()和invokeAndWait(),它们在Swing的事件调度线程上排队不要这样做,学习如何使用布局(+填充和边框)。我知道如何使用布局,我只是发现绝对定位更多handy@iie:了解如何使用布局的方法是使用它们。它们确实是不可或缺的。“我知道如何使用布局,我只是觉得绝对定位更方便”——这本身就是一个矛盾;-)
JPanel GuiServera(){
    JPanel panel = new JPanel();
    area = new JTextArea();
    area.setColumns(20);
    area.setRows(10);
    area.setText("The log is logging injoy");
    panel.setLayout(null);
    start = new JButton("Start");
    start.addActionListener(list);
    panel.add(start);
    stop = new JButton("Stop");
    stop.addActionListener(list);
    pane = new JButton("Admin Panel");
    panel.add(stop);

    panel.add(pane);
     scrolled = new JScrollPane(area);
     panel.add(scrolled);
    Insets insets = panel.getInsets();
    Dimension size = start.getPreferredSize();
    start.setBounds(40 + insets.left, 20 + insets.top,
    size.width, size.height);

    size = stop.getPreferredSize();
    stop.setBounds(40 + insets.left, 60 + insets.top,
    size.width, size.height);

    size = pane.getPreferredSize();
    pane.setBounds(40 + insets.left, 100 + insets.top,
    size.width, size.height);

    size = scrolled.getPreferredSize();
    scrolled.setBounds(160 + insets.left, 20 + insets.top,
    size.width, size.height);
    return panel;
}
class Nasluchiwacz implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==start){
            System.out.println("start");
            area.append("start button\n");
            try {
                inzServer.Runer();
            } catch (Exception ex) {
                Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        else if (e.getSource()==stop){
            area.setText(area.getText()+"\nstop\n");
        }
    }

}