简体   繁体   English

根据按下哪个按钮创建不同数量的JTextField

[英]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? 我的程序打算显示4个按钮,每个按钮都有一个数字,然后根据所按下的按钮,下一个屏幕将显示不同数量的JTextField,但是当按下任何按钮时,下一个面板是否为空白? 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. 在创建时,由于playerSelected为0,所以createPlayersPanel JPanel为空。

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. 由于仅在此处使用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;

}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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