2015-10-05 139 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

相反,如果您希望能够更新UI(简单且安全),则应该在不同的Thread中启动服务器或使用SwingWorker。请参阅Worker Threads and SwingWorker了解更多详情

+0

完美。 Swingworkers正是我需要的笏。拯救了我的生活@MadProgrammer – ustaad