java - Gui 卡住在 while 循环中

标签 java swing user-interface network-programming concurrency

服务器.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");
        }
    }

}

最佳答案

你几乎做对了。 而不是流道延长线。使其实现可运行。

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

关于java - Gui 卡住在 while 循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110746/

相关文章:

android - 返回错误: android. view.ViewRootImpl$CalledFromWrongThreadException:只有创建 View 层次结构的原始线程才能触摸其 View

java - 从毫秒转换为 MM :ss. mmm (Java)

java - C# 中有 Integer 类吗?

java - JSplitPane + MiGLayout : how to enable proportional autoresizing

java - 确定谁调用stateChanged

jquery调整嵌套div的大小

java - Jackson objectMapping 没有获取 JSON 数据

java - 如何使用 libgdx scene2d 创建多页屏幕?

java - 如何右对齐 JLabel 中的图标?

python - 如何从 "B"类中调用 "A"类的实例方法?