2014-03-24 40 views
1

我在我的程序中有一個java menubar,它只有1個選項和2個子選項,文件 - >保存,關閉。但不是保存並關閉,我的選項是服務器和客戶端。所以對於第一選項的動作事件我有這樣的Java的動作監聽:Java Menubar Action到一個類

public class serverAction extends AbstractAction 
    { 
     public serverAction() 
     { 
      super(); 
     } 
     public void actionPerformed(ActionEvent e) 
     { 
      JOptionPane.showMessageDialog(null, "Test"); 
     } 

    } 

所以這個工作,當我點擊文件 - >服務器上,它會彈出,上面寫着測試的窗口。現在我有一個服務器類(即我已經單獨測試,並知道它的工作原理),看起來像這樣:

public class SocketServer { 

    public static void main(String[] args) throws Exception { 
     ... 
    } 
    private static class ClientListenThread extends Thread {   
     public ClientListenThread(Socket socket, int ClientNumber){ 
      ... 
     }  
     public void run() { 
      ... 
     } 
    } 

    private static class ServerSendThread extends Thread {  
     public ServerSendThread(Socket socket) { 
      ... 
     }  
     public void run() { 
      ... 
     } 
    } 
} 

現在我需要調用這個SocketServer類當我點擊我的主要程序的服務器選項,以便它可以啓動服務器代碼並等待並監聽任何客戶端連接。我的問題是,如何從serverAction類中啓動整個SocketServer類代碼?

回答

3

您的nested-classesprivate,這意味着僅在ServerSocket類中可見。因此,您可以提供具有更多可見性的輔助方法或更改類聲明簽名,從而提高可見性。

例與helper方法:

public class SocketServer { 
. 
. 
//nested classes declaration  
public static void startServer(){ 
    //code to start threads new SomeThread().start(); 
}  
} 

而在你的行動

public class ServerAction extends AbstractAction{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      SocketServer.startServer(); 
      JOptionPane.showMessageDialog(null, "Test"); 
     } 
} 

這將是巨大的,如果當一個客戶端連接等,您可以通知,我建議你到看看SwingWorker提供有用的工具來處理後臺線程和gui線程之間的通知。

瞭解更多:Worker threads and SwingWorker

注:如果您實現Runnable而延長線,您不添加任何特殊功能,線程沒有理由,更多的細節在這裏將是巨大的 - >"implements Runnable" vs. "extends Thread"

+0

所以我會從'startServer()'調用'main'函數? – Richard

+0

@Richard不,主要是你的應用程序的入口點。你在那裏創建你的'gui',當你點擊菜單'Server'''''時,'actionPerformed'被執行並且你在那裏啓動服務器。 – nachokk

+0

@nackhokk另外,有沒有一種簡單的方法來製作java窗口(比如拖放式的gui,它會爲我編寫代碼?),而不是我不得不花費數小時的時間試圖讓代碼中的對齊方式正確? – Richard