2017-03-02 117 views
0

我的程序是指以顯示每個4個按鈕與一個號碼,然後根據按鈕按下的下一個屏幕將顯示出不同的數JTextField的的JTextField的,但是當任何按鈕被按下下一個面板是空白的?非常感謝任何幫助和建議。創建不同的量取決於哪個按鈕被按下

public class TestGui { 

    static int playersSelected = 0; 

    public static void main(String[] args) { 
    JFrame gameWindow = new JFrame("Trivial Pursuit"); 
    gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gameWindow.setSize(800, 650); 
    gameWindow.setVisible(true); 

    JPanel mainMenu = new JPanel(); 

    //create layout for main menu 
    mainMenu.setLayout(new FlowLayout(FlowLayout.CENTER)); 

    //add the contents of the main menu panel to the application window 
    gameWindow.add(mainMenu); 

    JButton[] playerButton = new JButton[4]; 
    for (int i = 0; i < playerButton.length; i++) { 
     final int FinalI = i; 
     playerButton[i] = new JButton("Button " + i); 
     mainMenu.add(playerButton[i]); 
     playerButton[i].setOpaque(true); 
     playerButton[i].setPreferredSize(new Dimension(271, 123)); 
     playerButton[i].setContentAreaFilled(true); 
     playerButton[i].setBorder(BorderFactory.createEmptyBorder()); 

     playerButton[i].addMouseListener(new java.awt.event.MouseAdapter() { 
      @Override 
      public void mouseEntered(java.awt.event.MouseEvent evt) { 
       playerButton[FinalI].setBorder(BorderFactory.createLoweredBevelBorder()); 
      } 

      @Override 
      public void mouseExited(java.awt.event.MouseEvent evt) { 
       playerButton[FinalI].setBorder(BorderFactory.createEmptyBorder()); 
      } 
     }); 
    } 

    JLabel[] playerNumberText = new JLabel[5]; 
    JTextField[] createPlayers = new JTextField[5]; 

    JPanel createPlayersPanel = new JPanel(); 
    createPlayersPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
    createPlayersPanel.setVisible(true); 

    for (int i = 1; i <= playersSelected; i++) { 
     final int finalI = i; 
     createPlayers[i] = new JTextField("Player " + i + " input name here"); 
     createPlayers[i].setPreferredSize(new Dimension(160, 20)); 

     playerNumberText[i] = new JLabel(); 
     playerNumberText[i].setText("Player " + i); 
     playerNumberText[i].setPreferredSize(new Dimension(350, 100)); 
     playerNumberText[i].setHorizontalAlignment(SwingConstants.CENTER); 
     createPlayersPanel.add(playerNumberText[i]); 

     createPlayers[i].addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (createPlayers[finalI].getText().equals("Player " + finalI + " input name here")) { 
        createPlayers[finalI].setText(""); 
       } 
      } 
     }); 
    } 

    for (int i = 0; i < playerButton.length; i++) { 
     final int finalI = i; 
     playerButton[i].addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       gameWindow.remove(mainMenu); 
       gameWindow.add(createPlayersPanel); 
       switch (finalI) { 
        case 0: 

         playersSelected = 2; 
         break; 
        case 1: 

         playersSelected = 3; 

         break; 
        case 2: 

         playersSelected = 4; 

         break; 
        case 3: 

         break; 
       } 
       gameWindow.revalidate(); 
       gameWindow.repaint(); 
       System.out.println(playersSelected); 
      } 
      }); 
     } 
    } 
} 
+0

這可能會對你有所幫助:https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/dialogs/ ParamDialog.java – ControlAltDel

+0

很難看到你想要完成什麼。你能舉一個最簡單的例子嗎? – ControlAltDel

+0

@ControlAltDel令人驚訝的是,這是一個最小的,我很新的編程,所以我很抱歉我的代碼是多麼混亂。 –

回答

1

在創建時,你createPlayersPanelJPanel是空的,因爲playerSelected爲0

在你的動作偵聽器,該面板是從來沒有更新,所以它仍然是一個空的面板。

你可以做的是創建動態生成的,而不是面板構建它只有在啓動時的方法。 作爲playerSelected只在這裏使用,你可以刪除這個靜態變量,並直接從你的行動聽衆傳遞值。

private static JPanel buildPlayersPanel(int playerSelected) { 

     JPanel createPlayersPanel = new JPanel(); 
     createPlayersPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     createPlayersPanel.setVisible(true); 

     for (int i = 1; i <= playersSelected; i++) { 
      final int finalI = i; 
      createPlayers[i] = new JTextField("Player " + i + " input name here"); 
      createPlayers[i].setPreferredSize(new Dimension(160, 20)); 

      playerNumberText[i] = new JLabel(); 
      playerNumberText[i].setText("Player " + i); 
      playerNumberText[i].setPreferredSize(new Dimension(350, 100)); 
      playerNumberText[i].setHorizontalAlignment(SwingConstants.CENTER); 
      createPlayersPanel.add(playerNumberText[i]); 
      createPlayersPanel.add(createPlayers[i]); 

      createPlayers[i].addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (createPlayers[finalI].getText().equals("Player " + finalI + " input name here")) { 
         createPlayers[finalI].setText(""); 
        } 
       } 
      }); 
     } 

    return createPlayersPanel; 

} 

和動作監聽器裏:

  @Override 
      public void actionPerformed(ActionEvent ae) { 

       int playersSelected = 0; 

       switch (finalI) { 
        case 0: 

         playersSelected = 2; 
         break; 
        case 1: 

         playersSelected = 3; 

         break; 
        case 2: 

         playersSelected = 4; 

         break; 
        case 3: 

         break; 
       } 
       gameWindow.remove(mainMenu); 
       gameWindow.add(buildPlayersPanel(playersSelected)); 
       gameWindow.revalidate(); 
       gameWindow.repaint(); 
       System.out.println(playersSelected); 
      } 
+0

'gameWindow.add(buildPlayersPanel(playersSelected));' 這行代碼拋出錯誤'非靜態方法buildPlayersPanel(int)不能從靜態上下文中引用' –

+0

哦,你的電話是靜態的,我錯過了。在這種情況下使方法靜態(請參閱我的上一次編輯)。請注意,您應該避免使用這麼多的一成不變的東西,但對於例如起見,會做:) – Berger

+0

也JTextField中沒有出現,將JLabel雖然。是啊,我是用靜態的,所以我不能確定的任何其他方式 –

相關問題