2013-10-16 34 views
0

我想在java中做這樣的事情:Java中的Form.ShowDialog

http://msdn.microsoft.com/pl-pl/library/c7ykbedk.aspx

該程序是等待回覆。 我有一個類擴展了JFrame(PlayerWindow),第二個內部類擴展了JDialog(PlayerLogWindow)。另一個類(Player)包含主要方法,並需要由JDialog類中的用戶參數編寫。使用while(true)看起來不錯...也許......就像模態對話框?

public class Player implements Runnable 
{ 
    private Socket socket; 
    private String host, nazwa; 
    private ObjectOutputStream output; 
    private ObjectInputStream input; 
    private static int port; 

public Player(String host, int port) throws IOException 
{ 
    this.host = host; 
    this.port = port; 
} 

@Override 
public void run() 
{ 
    String m1, m2; 
    try 
    { 
     socket = new Socket(host, port); 
     input = new ObjectInputStream(socket.getInputStream()); 
     output = new ObjectOutputStream(socket.getOutputStream()); 
     output.flush(); 

     System.out.println("Client's host " + socket.getLocalAddress().getHostName()); 

     nazwa = Communication.inString("Whats your name: "); 
     output.writeObject(nazwa); 

     do 
     { 
      m1 = (String) input.readObject(); 
      System.out.println("\n" + "Data from server: " + m1); 
      m2 = Communication.inString("Write sth to server: "); 
      output.writeObject(nazwa + ": " + m2); 
     } while (!m2.equals("quit")); 

     output.close(); 
     input.close(); 
     socket.close(); 
    } catch (Exception e) 
    { 
     System.out.println(e); 
    } 
} 

public static void main(String[] args) throws IOException 
{ 
    PlayerWindow playerWindow = new PlayerWindow();  
    String host = InetAddress.getLocalHost().getHostName(); 

    while(true) 
    { 
     port = playerWindow.port; 

     if (playerWindow.port != 0) 
     { 
      ShipServer server = new ShipServer(port, host); 
      Thread threadServer = new Thread(server); 
      threadServer.start(); 
      break; 
     } 
    }   
} 

}

public class PlayerWindow extends JFrame 
{ 
    private PlayerLogWindow playerLog; 
    int port; 

//GUI 
private JMenuBar jMenuBar; 
private JMenu jMenuFile, jMenuHelp; 
private JMenuItem jMenuItemNewGame, jMenuItemExitGame, jMenuAbout; 

public PlayerWindow() 
{ 
    createWindow(); 

    createJMenu(); 
} 

private void createWindow() 
{ 
    setTitle("Game"); 
    setUndecorated(true); 
    getRootPane().setWindowDecorationStyle(JRootPane.FRAME); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Toolkit t = getToolkit(); 
    Dimension dim = t.getScreenSize(); 
    setLocation(dim.width/2-400, dim.height/2-400); 

    pack(); 
    setSize(1000, 800); 
    setVisible(true);  
} 

private void createJMenu() 
{ 
    JMenuBar jMenuBar = new JMenuBar();   
    setJMenuBar(jMenuBar); 

    jMenuFile = new JMenu("Start");  
    jMenuFile.setFont(new Font("Sansserif", Font.ROMAN_BASELINE, 18)); 
    jMenuBar.add(jMenuFile); 
    jMenuItemNewGame = new JMenuItem("New game"); 
    jMenuItemNewGame.setFont(new Font("Sansserif", Font.ROMAN_BASELINE, 18)); 
    jMenuFile.add(jMenuItemNewGame); 
    jMenuFile.addSeparator(); 
    jMenuItemExitGame = new JMenuItem("End"); 
    jMenuItemExitGame.setFont(new Font("Sansserif", Font.ROMAN_BASELINE, 18)); 
    jMenuFile.add(jMenuItemExitGame); 

    jMenuHelp = new JMenu("Help"); 
    jMenuHelp.setFont(new Font("Sansserif", Font.ROMAN_BASELINE, 18)); 
    jMenuBar.add(jMenuHelp); 
    jMenuAbout = new JMenuItem("About..."); 
    jMenuAbout.setFont(new Font("Sansserif", Font.ROMAN_BASELINE, 18)); 
    jMenuHelp.add(jMenuAbout);  

    playerWindowActionListener(); 
} 

public void playerWindowActionListener() 
{  
    jMenuItemNewGame.addActionListener(new ActionListener() 
    {   
     @Override 
     public void actionPerformed(ActionEvent arg0) 
     { 
      if(playerLog == null) 
       playerLog = new PlayerLogWindow();     

      playerLog.setVisible(true);       
     } 
    });  
} 

class PlayerLogWindow extends JDialog 
{ 
    //GUI  
    private JPanel jPanelMain; 
    private JButton jButtonConnect; 
    private JTextField jTextPort; 


    public PlayerLogWindow() 
    { 
     createWindow(); 

     createComponents();  
    } 

    private void createWindow() 
    { 
     setTitle("Choose server"); 
     setUndecorated(true); 
     getRootPane().setWindowDecorationStyle(JRootPane.FRAME); 

     Toolkit t = getToolkit(); 
     Dimension dim = t.getScreenSize(); 
     setLocation(dim.width/2-200, dim.height/2-200); 

     pack(); 
     setSize(400, 200);   
    } 

    public void createComponents() 
    { 
     jPanelMain = new JPanel(new BorderLayout(5,5)); 
     JLabel jLabelServer = new JLabel("Connect", JLabel.CENTER); 
     jLabelServer.setFont(new Font("Sanserif", Font.BOLD, 16)); 

     JPanel jPanelPort = new JPanel(new FlowLayout()); 
     JLabel jLabelPort = new JLabel("Port number", JLabel.CENTER); 
     jTextPort = new JTextField(10); 
     jPanelPort.add(jLabelPort); 
     jPanelPort.add(jTextPort);  

     jButtonConnect = new JButton("Start");  

     jPanelMain.add(jLabelServer, "North"); 
     jPanelMain.add(jPanelPort); 
     jPanelMain.add(jButtonConnect, "South"); 

     add(jPanelMain);   

     connectUser();    
    } 

    public void connectUser() 
    { 
     jButtonConnect.addActionListener(new ActionListener() 
     {   
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       port = Integer.parseInt(jTextPort.getText());     
       dispose(); 
      } 
     });  
    } 
} 

}

+0

OK的Concurrency in Java,有什麼題?什麼* while(true)*,哪裏? –

+0

第一課,主要方法 – szefu

回答

1

你真正需要的是某種方式的GUI告訴連接管理器,它可以嘗試連接,而將試圖輪詢UI。這使您可以斷開/解耦程序的不同部分。

首先在單獨的線程中創建「連接」,然後等待中央鎖。這將導致線程等待,直到它被通知,此時它可以決定它應該做什麼(嘗試連接與否)。

在你的主界面,一旦你收集到的服務器屬性,你會通知全局鎖,這將喚醒連接線

您可能會發現一些使用

相關問題