简体   繁体   中英

create different amount of JTextFields depending on which button was pressed

My program is meant to display 4 buttons each with a number, then depending on the button pressed the next screen will show a different number of JTextFields, but when any of the buttons are pressed the next panel is blank? Any help and suggestions are greatly appreciated thanks.

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);
            }
          });
      }
  }
}

At creation time, your createPlayersPanel JPanel is empty since playerSelected is 0.

In your action listener, this panel is never updated, so it remains an empty panel.

What you could do is create a method to dynamically build the panel instead of building it only on startup. As playerSelected is only used here, you can remove this static variable and pass the value directly from your action listener.

    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;

}

And inside the action listener :

            @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);
            }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM