2013-11-26 13 views
1

我有一個名爲Version3的選項卡式Jframe,它實現了Runnable。進入它我有3個JPanels在不同的tabbs.Next這些標籤我有一個textarea。 我想讓我的GUI偵聽消息並將它們顯示在textarea中。我試圖讓我的GUI版本3成爲一臺服務器,它可以隨時收聽來自客戶端的任何消息。如何在不連接客戶端的情況下在GUI服務器中顯示組件?

java.awt.EventQueue.invokeLater(new Runnable(){ 
    public void run(){ 
      Version3 v=new Version3(); 
      v.setVisible(true); 
      v.listenTo(); 
     } 
}); 

我做了我的GUI版本3的服務器,但是當我運行程序的GUI組件不顯示,直到它連接到client.I只是沒有組件空白GUI窗口。任何想法如何在沒有連接客戶端的情況下在我的GUI上顯示我的所有組件?

+1

顯示你如何構建你的GUI?發佈'sscce'以獲得更好的幫助。 – alex2410

回答

1

我做了我的GUI版本3的服務器,但是當我運行該程序的GUI的 組件不顯示,直到它連接到client.I 只是沒有組件空白GUI窗口。任何想法如何 顯示所有我的組件在我的GUI沒有連接客戶端?

我認爲當你的班級嘗試連接到客戶端時,你阻止Event Dispatching Thread(又名EDT)的可能性很大。這就是爲什麼當你有連接時它工作的原因,但是當你沒有連接時它不會工作。 EDT是Swing組件創建和更新發生的單一且特殊的線程。如果您在EDT中運行繁重的任務,那麼您的GUI將凍結,Swing組件將無法工作(甚至無法顯示)。

看一看Concurrency in Swing路徑以瞭解Swing中的併發性。

題外話:請考慮在未來的問題中添加您的代碼。正如@ alex2410建議,如果你包含一個SSCCE來證明你的問題會更好。

0

服務器:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Server extends JPanel { 

    Socket socket; 
    final static int PORT = 2325; 
    PrintWriter pr; 
    public ServerSocket serverSocket; 
    JButton btn_sendHello; 
    int counter; 

    Thread thread; 

    public Server() { 

     counter = 0; 
     btn_sendHello = new JButton("Send hello"); 
     btn_sendHello.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (pr != null) { 
        pr.println("Hello from server " + ++counter); 
       } 
      } 
     }); 

     this.add(btn_sendHello); 

     try { 
      serverSocket = new ServerSocket(PORT); 
      thread = new Thread(waitingClient); 
      thread.start(); 
     } catch (IOException ex) { 
      Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    Runnable waitingClient = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       socket = serverSocket.accept(); 
       openStreams(); 
      } catch (IOException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }; 

    private void openStreams() { 
     if (socket != null) { 
      try { 
       pr = new PrintWriter(socket.getOutputStream(), true); 
      } catch (IOException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setTitle("Server"); 
       frame.add(new Server()); 
       frame.pack(); 
       frame.setSize(250, 100); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

客戶:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Client extends JPanel { 

    final static int PORT = 2325; 
    private Socket socket; 
    private BufferedReader fromServer; 
    private JTextField jtfield; 
    Thread threadReceive; 

    public Client() { 
     jtfield = new JTextField(12); 
     this.add(jtfield); 

     try { 
      socket = new Socket("localhost", PORT); 
      openStreams(); 
      Thread thread = new Thread(receives); 
      thread.start(); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    Runnable receives = new Runnable() { 
     @Override 
     public void run() { 
      while (true) { 
       synchronized (this) { 
        if (socket != null) { 
         processServerInput(); 
        } 
       } 
      } 
     } 
    }; 

    private void openStreams() { 
     try { 
      if (socket != null) { 
       fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void processServerInput() { 
     try { 
      String line = fromServer.readLine(); 
      while (!(line.equals("Bye"))) { 
       jtfield.setText(line); 
       line = fromServer.readLine(); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    void closeStreams() { 
     try { 
      fromServer.close(); 
      socket.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setTitle("Client"); 
       frame.add(new Client()); 
       frame.pack(); 
       frame.setSize(250, 100); 
       frame.setLocationRelativeTo(null); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
相關問題