【问题标题】:Gui froze in while loopGui 在 while 循环中冻结
【发布时间】:2011-11-13 09:38:28
【问题描述】:

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();
        }
    }
}

}

class Client extends Thread
{
private Socket connectionSocket;
private String pozX;
private String ans;
private String pozY;
private String capitalizedSentence;
private BufferedReader inFromClient;
private DataOutputStream outToClient;

public Client(Socket c) throws IOException
{
    connectionSocket = c;
}

public void run() 
{
    try
    {    
        inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        outToClient = new DataOutputStream(connectionSocket.getOutputStream());

        pozX = inFromClient.readLine();
        pozY = inFromClient.readLine();
        System.out.println(pozX);
        System.out.println(pozY);
        capitalizedSentence = pozX.toUpperCase() + '\n';
          BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

       outToClient.writeBytes(capitalizedSentence);

    }
    catch(IOException e)
    {
        System.out.println("Errore: " + e);
    }
}

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");
        }
    }

}

【问题讨论】:

  • 你自己回答了。您的 GUI 需要处理事件以响应用户交互。您需要在另一个线程上运行干扰 GUI 的东西以防止这种情况发生。这并不难,只需将代码放入 Runnable 实现中,然后 new Thread(runnable).start() 即可。如果您的线程需要与 GUI 交互,那么您需要了解 invokeLater() 和 invokeAndWait() 在 Swing 的事件调度线程上排队的东西。
  • panel.setLayout(null); 不要那样做,学习如何使用布局(+填充和边框)。
  • 我知道如何使用布局,我只是觉得绝对定位更方便
  • @iie:学习使用布局的方法就是使用它们。它们确实是不可或缺的。
  • '我知道如何使用布局,我只是觉得绝对定位更方便' - 这本身就是矛盾的 ;-)

标签: java swing user-interface network-programming concurrency


【解决方案1】:

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

然后在你的 guiclass 中。你可以要么 new Thread(inserver).start(); 或者看看 Executorservice 或 Swingworkers。

【讨论】:

    【解决方案2】:

    您应该尝试使用 swingWorker。 检查这个Tutorial of sun

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2014-09-04
      • 1970-01-01
      • 2015-01-28
      • 2017-10-20
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多