2017-03-02 118 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虽然。是啊,我是用静态的,所以我不能确定的任何其他方式 –

相关问题