2015-10-05 3 views
3

Я работаю над администрированием удаленного рабочего стола Java. Он отлично работает, когда я запускаю основной класс инициатора сервера отдельно. но когда я вызываю этот класс из события действия кнопки, кадр просто зависает и показывает черный экран. Вот код. Любая помощь ?Администрирование удаленных рабочих столов Java

import java.awt.BorderLayout; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 


public class ServerInitiator { 
    //Main server frame 
    private JFrame frame = new JFrame(); 
    //JDesktopPane represents the main container that will contain all 
    //connected clients' screens 
    private JDesktopPane desktop = new JDesktopPane(); 

    public static void main(String args[]){ 
     String port = JOptionPane.showInputDialog("Please enter listening port"); 
     new ServerInitiator().initialize(Integer.parseInt(port)); 
    } 

    public void initialize(int port){ 

     try { 
      ServerSocket sc = new ServerSocket(port); 
      //Show Server GUI 
      drawGUI(); 
      //Listen to server port and accept clients connections 
      while(true){ 
       Socket client = sc.accept(); 
       System.out.println("New client Connected to the server"); 
       //Per each client create a ClientHandler 
       new ClientHandler(client,desktop); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    /* 
    * Draws the main server GUI 
    */ 
    public void drawGUI(){ 
      frame.add(desktop,BorderLayout.CENTER); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      //Show the frame in a maximized state 
      frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
    } 
} 

ответ

3

Ваш while цикл, скорее всего, работает с в контексте событий Диспетчерская тему, блокируя его от обработки каких-либо новых событий (в том числе перекрашивать события)

public void initialize(int port){ 

    try { 
     ServerSocket sc = new ServerSocket(port); 
     //Show Server GUI 
     drawGUI(); 
     //Listen to server port and accept clients connections 
     while(true){ 
      Socket client = sc.accept(); 
      System.out.println("New client Connected to the server"); 
      //Per each client create a ClientHandler 
      new ClientHandler(client,desktop); 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

См Concurrency in Swing для более подробной информации.

Вместо этого вы должны запустить свой сервер в другом Thread или использовать SwingWorker, если хотите обновить интерфейс (просто и безопасно). См. Worker Threads and SwingWorker для получения более подробной информации

+0

безупречный. Swingworkers был точно ват, я нуждался. Сохранял мою жизнь @MadProgrammer – ustaad