2017-03-02 2 views
0

Mon programme est destiné à afficher 4 boutons avec un numéro, puis selon le bouton pressé l'écran suivant montrera un nombre différent de JTextFields, mais quand l'un des boutons sont pressés le panneau suivant est vide? Toute aide et suggestions sont grandement appréciées merci.créer une quantité différente de JTextFields selon le bouton qui a été pressé

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

Cela pourrait vous être utile: https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/dialogs/ ParamDialog.java – ControlAltDel

+0

Il est très difficile de voir ce que vous essayez d'accomplir. Pouvez-vous poster un exemple minimal? – ControlAltDel

+0

@ControlAltDel étonnamment c'est un minimum, je suis très nouveau à la programmation, donc je suis désolé à quel point mon code est confus. –

Répondre

1

Au moment de la création, votre createPlayersPanelJPanel est vide depuis playerSelected est 0.

Dans l'écouteur d'action, ce panneau est jamais mis à jour, il reste un panneau vide.

Ce que vous pourriez faire est de créer une méthode pour construire dynamiquement le panneau au lieu de le construire seulement au démarrage. Comme playerSelected est uniquement utilisé ici, vous pouvez supprimer cette variable statique et transmettre la valeur directement à votre écouteur d'actions.

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; 

} 

Et à l'intérieur de l'auditeur d'action:

  @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));' Cette ligne de code lance l'erreur 'méthode non statique buildPlayersPanel (int) ne peut pas être référencé à partir d'un contexte statique' –

+0

Oh, vos appels sont statiques, j'ai raté cela. Rendez la méthode statique dans ce cas (voir ma dernière modification). Notez que vous devriez éviter d'utiliser autant de choses statiques, mais pour le bien de l'exemple, ça va faire :) – Berger

+0

aussi le JTextField n'apparait pas, le JLabel est bien. Ouais, on m'a seulement enseigné en utilisant le statique, donc je ne suis pas sûr d'autres façons. –