2017-03-02 1 views
0

Mein Programm soll 4 Tasten mit jeweils einer Nummer anzeigen, dann zeigt der nächste Bildschirm je nach gedrückter Taste eine andere Anzahl von JTextFields an, aber wenn eine der Tasten gedrückt wird Sind die nächsten Felder leer? Jede Hilfe und Vorschläge sind sehr dankbar, danke.unterschiedliche Anzahl von JTextFields erstellen, abhängig davon, welche Taste gedrückt wurde

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

Dies könnte Ihnen nützlich sein: https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/dialogs/ ParamDialog.java – ControlAltDel

+0

Es ist sehr schwer zu sehen, was Sie erreichen möchten. Können Sie ein minimales Beispiel veröffentlichen? – ControlAltDel

+0

@ControlAltDel überraschend ist dies ein minimum, ich bin sehr neu in der Programmierung, es tut mir leid, wie verwirrend mein Code ist. –

Antwort

1

bei der Erstellung, Ihre createPlayersPanelJPanel ist leer, da playerSelected ist 0.

In Ihrer Aktion Hörer, diese Platte nie aktualisiert wird, so dass es eine leere Platte bleibt.

Sie können eine Methode erstellen, um das Bedienfeld dynamisch zu erstellen, anstatt es nur beim Start zu erstellen. Da playerSelected nur hier verwendet wird, können Sie diese statische Variable entfernen und den Wert direkt von Ihrem Aktionslistener übergeben.

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; 

} 

Und in der Aktion Hörer:

  @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));' Diese Codezeile wirft den Fehler 'nicht statische Methode buildPlayersPanel (int) kann nicht aus einem statischen Kontext referenziert werden' –

+0

Oh, deine Anrufe sind statisch, das habe ich verpasst. Machen Sie die Methode in diesem Fall statisch (siehe meine letzte Änderung). Beachten Sie, dass Sie vermeiden sollten, so viele statische Dinge zu verwenden, aber aus Gründen des Beispiels wird es tun :) – Berger

+0

auch das JTextField wird nicht angezeigt, das JLabel ist aber. Ja, ich wurde nur mit statischen Methoden gelehrt, so dass ich mir keine anderen Möglichkeiten gebe. –

Verwandte Themen