2015-10-11 171 views
0

我目前在設計任務的GUI時遇到問題。雖然該項目目前的功能有一段時間,我希望它顯示用戶必須等待播放器,所以我想gamePanel不可見在第一個和waitingForPlayerPanel顯示「等待其他球員「。未顯示Java Swing JPanel

由於某種原因不幸,由於某種原因waitingForPlayerPanel未被顯示,儘管在hideGamePanel中設置爲可見。如果有幫助,我目前正在Ubuntu 14.04上執行此項目。

這是我寫的代碼片段。

public class ClientGame extends JFrame implements ActionListener, Runnable { 
    private Socket server = null; 
    private BufferedReader in = null; 
    private PrintWriter out = null; 

    private static final Color[] playerColours = { Color.GREEN, Color.RED }; 

    private JButton[][] myButtons = new JButton[3][3]; 
    private JLabel waitingForPlayer = new JLabel("Waiting for other player"); 
    private JPanel waitingForPlayerPanel = new JPanel(); 
    private JPanel gamePanel = new JPanel(); 

    ClientGame() { 
     try { 
      this.server = new Socket("127.0.0.1", 4444); 
      this.in = new BufferedReader(new InputStreamReader(this.server.getInputStream())); 
      this.out = new PrintWriter(this.server.getOutputStream(), true); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(null, "Alert", 
        "Couldn't connect to the server.", JOptionPane.ERROR_MESSAGE); 
      System.exit(-1); 
     } 
    } 

    public void initUI() { 
     this.waitingForPlayerPanel.setLayout(new BorderLayout()); 
     this.waitingForPlayerPanel.setBackground(Color.white); 
     this.waitingForPlayerPanel.add("Center", this.waitingForPlayer); 
     this.getContentPane().add(this.waitingForPlayerPanel); 

     this.gamePanel.setLayout(new GridLayout(3,3)); 
     this.gamePanel.setSize(450,450); 
     this.gamePanel.setBackground(Color.white); 
     this.getContentPane().add(this.gamePanel); 
     for(int i=0;i<3;i++) { 
      for(int j=0;j<3;j++) { 
       this.myButtons[i][j] = new JButton(); 
       this.myButtons[i][j].setPreferredSize(new Dimension(150, 150)); 
       this.myButtons[i][j].addActionListener(this); 
       this.gamePanel.add(this.myButtons[i][j]); 
      } 
     } 

     this.hideGamePanel(); 

     this.setVisible(true); 

     WindowListener l = new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }; 

     this.addWindowListener(l); 
    } 

    private void hideGamePanel() { 
     this.gamePanel.setVisible(false); 
     this.waitingForPlayerPanel.setVisible(true); 
     this.pack(); 
    } 

    private void showGamePanel() { 
     this.gamePanel.setVisible(true); 
     this.waitingForPlayerPanel.setVisible(false); 
     this.pack(); 
    } 
    // ... 
} 
+0

嗯,我覺得我學習更多在這裏比我可以指導,但你需要'this.'上?你不應該試試'super()'。 –

+0

我看不到你在做什麼,我應該在哪裏使用'super()。'? – PurityLake

+1

使用'CardLayout'在面板之間切換 –

回答

1

問題解決了使用CardLayout

public class ClientGame extends JFrame implements ActionListener, Runnable { 
    private Socket server = null; 
    private BufferedReader in = null; 
    private PrintWriter out = null; 

    // IDs for CardLayout 
    private static final String WAITING_PANEL_ID = "waiting"; 
    private static final String GAME_PANEL_ID = "game"; 

    private JButton[][] myButtons = new JButton[3][3]; 
    private JLabel waitingForPlayer = new JLabel("Waiting for other player"); 
    private JPanel cardPanel = new JPanel(); 
    private JPanel waitingForPlayerPanel = new JPanel(); 
    private JPanel gamePanel = new JPanel(); 
    private int squares = 9; 

    protected boolean isTurn = false; 

    ClientGame() { 
     try { 
      this.server = new Socket("127.0.0.1", 4444); 
      this.in = new BufferedReader(new InputStreamReader(this.server.getInputStream())); 
      this.out = new PrintWriter(this.server.getOutputStream(), true); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(null, "Alert", 
        "Couldn't connect to the server.", JOptionPane.ERROR_MESSAGE); 
      System.exit(-1); 
     } 
    } 

    public void initUI() { 
     this.cardPanel.setLayout(new CardLayout()); 

     this.waitingForPlayerPanel.setLayout(new BorderLayout()); 
     this.waitingForPlayerPanel.setBackground(Color.white); 
     this.waitingForPlayerPanel.add(BorderLayout.CENTER, this.waitingForPlayer); 
     this.cardPanel.add(this.waitingForPlayerPanel, WAITING_PANEL_ID); 

     this.gamePanel.setLayout(new GridLayout(3,3)); 
     this.gamePanel.setSize(450,450); 
     this.gamePanel.setBackground(Color.white); 
     this.cardPanel.add(this.gamePanel, GAME_PANEL_ID); 
     for(int i=0;i<3;i++) { 
      for(int j=0;j<3;j++) { 
       this.myButtons[i][j] = new JButton(); 
       this.myButtons[i][j].setPreferredSize(new Dimension(150, 150)); 
       this.myButtons[i][j].addActionListener(this); 
       this.gamePanel.add(this.myButtons[i][j]); 
      } 
     } 

     this.getContentPane().add(this.cardPanel); 

     this.hideGamePanel(); 

     this.setVisible(true); 

     WindowListener l = new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }; 

     this.addWindowListener(l); 
    } 

    // changes made here 
    private void hideGamePanel() { 
     CardLayout cl = (CardLayout)this.cardPanel.getLayout(); 
     cl.show(this.cardPanel, WAITING_PANEL_ID); 
     this.pack(); 
    } 

    // changes made here 
    private void showGamePanel() { 
     CardLayout cl = (CardLayout)this.cardPanel.getLayout(); 
     cl.show(this.cardPanel, GAME_PANEL_ID); 
     this.pack(); 
    } 
}