2013-12-20 3 views
1

Я добавляю ввод имени игрока в свою игру с роком, бумагой, ножницами, и насколько я знаю, я могу просто использовать другую карту с JTextField, создать строку, а затем использовать ее для замены «Player 1/Player 2.» Единственная проблема заключается в том, что когда я добавляю свои TextFields к панели, которая затем добавляется в файл cardLayout, который, наконец, добавляется в фрейм, все пусто. Вот пример кода.Почему мой макет карты пуст после добавления JTextField?

final CardLayout cardLayout = new CardLayout(); 
final JPanel cardPanel = new JPanel(cardLayout); 

JPanel pname = new JPanel(); 

JTextField p1name = new JTextField(20); 
JTextField p2name = new JTextField(20); 

pname.add(p1name); 
pname.add(p2name); 

cardPanel.add(pname, "pname"); 

add(cardPanel); 

cardLayout.show(cardPanel, "pname"); 

Я пробовал все, что нашел в Интернете. Я запускаю JRE 7, и в последний раз, когда я проверял, он отлично работал на JRE 6 (это, вероятно, изменилось к настоящему времени, так как я возился с ним.) Любая помощь приветствуется. Спасибо!

Полный код, плохо отступ (пытаюсь работать на моей аккуратности)

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import javax.swing.JLabel; 
import javax.swing.JButton; 
import javax.swing.JTextField; 

import java.awt.CardLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.GridLayout; 

public class RPS extends JFrame { 

    public static void main(String[] args) { 
    new RPS(); 
    } 
    public RPS() { 
super("Rock, Paper, Scissors"); 

setSize(300, 300); 
setResizable(false); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 
setVisible(true); 

//Adds all of the components. 

final CardLayout cardLayout = new CardLayout(); 
final JPanel cardPanel = new JPanel(cardLayout); 
JPanel pname = new JPanel(); 
JPanel panel1 = new JPanel(); 
JPanel panel2r = new JPanel(); 
JPanel panel2p = new JPanel(); 
JPanel panel2s = new JPanel(); 
JPanel finish = new JPanel(); 

final JButton P1Rock = new JButton("Rock"); 
final JButton P1Paper = new JButton("Paper"); 
final JButton P1Scissors = new JButton("Scissors"); 

final JButton P2Rockr = new JButton("Rock"); 
final JButton P2Paperr = new JButton("Paper"); 
final JButton P2Scissorsr = new JButton("Scissors"); 

final JButton P2Rockp = new JButton("Rock"); 
final JButton P2Paperp = new JButton("Paper"); 
final JButton P2Scissorsp = new JButton("Scissors"); 

final JButton P2Rocks = new JButton("Rock"); 
final JButton P2Papers = new JButton("Paper"); 
final JButton P2Scissorss = new JButton("Scissors"); 

final JButton playAgain = new JButton("Play again?"); 

final JLabel statusLabel = new JLabel(" "); 

JTextField p1name = new JTextField(20); 
JTextField p2name = new JTextField(20); 

JLabel P1turn = new JLabel("It is Player 1's turn. Choose:"); 
JLabel P2turnr = new JLabel("It is Player 2's turn. Choose:"); 
JLabel P2turnp = new JLabel("It is Player 2's turn. Choose:"); 
JLabel P2turns = new JLabel("It is Player 2's turn. Choose:"); 

//Sets up and adds all of the panels. 

pname.add(p1name); 
pname.add(p2name); 

panel1.add(P1turn); 
panel1.add(P1Rock); 
panel1.add(P1Paper); 
panel1.add(P1Scissors); 
panel1.setLayout(new GridLayout(4,1)); 

panel2r.add(P2turnr); 
panel2r.add(P2Rockr); 
panel2r.add(P2Paperr); 
panel2r.add(P2Scissorsr); 
panel2r.setLayout(new GridLayout(4,1)); 

panel2p.add(P2turnp); 
panel2p.add(P2Rockp); 
panel2p.add(P2Paperp); 
panel2p.add(P2Scissorsp); 
panel2p.setLayout(new GridLayout(4,1)); 

panel2s.add(P2turns); 
panel2s.add(P2Rocks); 
panel2s.add(P2Papers); 
panel2s.add(P2Scissorss); 
panel2s.setLayout(new GridLayout(4,1)); 

finish.add(statusLabel); 
finish.add(playAgain); 
finish.setLayout(new GridLayout(2,1)); 

cardPanel.add(pname, "pname"); 
cardPanel.add(panel1, "player1"); 
cardPanel.add(panel2r, "player2r"); 
cardPanel.add(panel2p, "player2p"); 
cardPanel.add(panel2s, "player2s"); 
cardPanel.add(finish, "finish"); 

add(cardPanel); 

cardLayout.show(cardPanel, "pname"); 

//Determines player 1's choice. 

P1Rock.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    cardLayout.show(cardPanel, "player2r"); 
    } 
}); 

P1Paper.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    cardLayout.show(cardPanel, "player2p"); 
    } 
}); 

P1Scissors.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    cardLayout.show(cardPanel, "player2s"); 
    } 
}); 

playAgain.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    cardLayout.show(cardPanel, "player1"); 
    } 
}); 

//Determines player 2's choice and prints a result. 

P2Rockr.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("It's a tie!"); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Paperr.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 2 wins! Paper covers Rock."); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Scissorsr.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 1 wins! Rock crushes Scissors."); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Rockp.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 1 wins! Paper covers Rock!"); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Paperp.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("It's a tie!"); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Scissorsp.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 2 wins! Scissors cut paper."); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Rocks.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 2 wins! Rock crushes Scissors."); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Papers.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("Player 1 wins! Scissors cut Paper."); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

P2Scissorss.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
    statusLabel.setText("It's a tie!"); 
    cardLayout.show(cardPanel, "finish"); 
    } 
}); 

    } 
} 

EDIT: Просто протестировала его снова на моем JRE 6 ноутбука, без каких-либо проблем. Я начинаю думать, что проблема связана с моим рабочим столом. Мой компилятор - Dr. Java.

+0

Почему у вас есть 12 различных кнопок? –

+0

@peeskillet Кнопки имеют по существу карту с макетом карты, которая позволяет использовать кнопку воспроизведения и JButtons вместо JRadioButtons. – ZeroConnor

ответ

1

Посмотрите, как вы создаете свой CardLayout

cardPanel.add(pname, "pname"); 
    cardPanel.add(panel1, "player1"); 
    cardPanel.add(panel2r, "player2r"); 
    cardPanel.add(panel2p, "player2p"); 
    cardPanel.add(panel2s, "player2s"); 
    cardPanel.add(finish, "finish"); 
  • Сначала вы добавляете pname, который состоит только из двух текстовых полей

Смотрите здесь

JPanel pname = new JPanel(); 
JTextField p1name = new JTextField(20); 
JTextField p2name = new JTextField(20); 
pname.add(p1name); 
pname.add(p2name); 

С тех пор как вы впервые показали pname, cardLayout.show(cardPanel, "pname"); все, что вы увидите, это текстовые поля. И у этой панели нет кнопки или слушателя, которая продвинет макет карты на другую панель.

Я действительно не хочу входить во все группировки каждого отдельного компонента. Но подумайте о том, что вы хотите на каждой панели, и добавьте эти компоненты на другую панель, а затем добавьте каждый из них в макет группы. Помните, что в каждом представлении должна быть кнопка, которая будет показывать другое представление.

Я бы рекомендовал даже группировать все компоненты из одной панели вместе в коде, чтобы сделать ее более читаемой относительно того, какой компонент входит в метку. Причина, по которой я не хочу вдаваться в подробности о группировках, состоит в том, что ваш код трудно читать 1), потому что компоненты повсюду и 2) имена компонентов очень схожи.

Редактировать: Взгляните на этот пример. Вы можете запустить его. Это может не дать вам точной функциональности, которую вы ищете, но вы можете сравнить ее с вашим.

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class PeeskilletsRPS extends JPanel{ 

    // buttons 
    JButton P1Rock = new JButton("Rock"); 
    JButton P1Paper = new JButton("Paper"); 
    JButton P1Scissors = new JButton("Scissors"); 
    JButton P2Rock = new JButton("Rock"); 
    JButton P2Paper = new JButton("Paper"); 
    JButton P2Scissors = new JButton("Scissors"); 
    JButton jbtPlay = new JButton("Play"); 

    // panels 
    JPanel namesPanel; 
    JPanel player1Panel; 
    JPanel player2Panel; 

    // finish panel 
    JPanel finishPanel; 
    JButton playAgain; 
    JLabel result; 

    // CardLayout and main Panel 
    CardLayout cardLayout; 
    JPanel cardPanel; 

    String player1Choice; 
    String player2Choice; 
    String status; 

    String player2Name; 
    String player1Name; 


    public PeeskilletsRPS(){ 
     // names panel 
     JPanel p1 = new JPanel(new GridLayout(4,1)); 
     p1.add(new JLabel("Player 1 Name: ")); 
     final JTextField jtfname1 = new JTextField(15); 
     p1.add(jtfname1); 
     p1.add(new JLabel("Player 2 Name: ")); 
     final JTextField jtfname2 = new JTextField(15); 
     p1.add(jtfname2); 
     namesPanel = new JPanel(new BorderLayout()); 
     namesPanel.add(p1, BorderLayout.CENTER); 
     namesPanel.add(jbtPlay, BorderLayout.SOUTH); 

     // player 1 panel 
     JPanel player1Buttons = new JPanel(); 
     player1Buttons.add(P1Rock); 
     player1Buttons.add(P1Paper); 
     player1Buttons.add(P1Scissors); 
     player1Panel = new JPanel(new BorderLayout()); 
     player1Panel.add(player1Buttons, BorderLayout.SOUTH); 
     final JLabel jlblPlayer1 = new JLabel(" "); 
     jlblPlayer1.setHorizontalAlignment(JLabel.CENTER); 
     player1Panel.add(jlblPlayer1, BorderLayout.CENTER); 

     // player 2 panel 
     JPanel player2Buttons = new JPanel(); 
     player2Buttons.add(P2Rock); 
     player2Buttons.add(P2Paper); 
     player2Buttons.add(P2Scissors); 
     player2Panel = new JPanel(new BorderLayout()); 
     player2Panel.add(player2Buttons, BorderLayout.SOUTH); 
     final JLabel jlblPlayer2 = new JLabel(" "); 
     jlblPlayer2.setHorizontalAlignment(JLabel.CENTER); 
     player2Panel.add(jlblPlayer2, BorderLayout.CENTER); 

     // finish panel 
     result = new JLabel(" "); 
     playAgain = new JButton("Play Agian"); 
     finishPanel = new JPanel(new BorderLayout()); 
     finishPanel.add(playAgain, BorderLayout.SOUTH); 
     finishPanel.add(result, BorderLayout.CENTER); 
     result.setHorizontalAlignment(JLabel.CENTER); 

     // create card layout 
     cardLayout = new CardLayout(); 
     cardPanel = new JPanel(cardLayout); 
     cardPanel.add(namesPanel, "names"); 
     cardPanel.add(player1Panel, "player1"); 
     cardPanel.add(player2Panel, "player2"); 
     cardPanel.add(finishPanel, "finish"); 

     // add cardPanel to main panel 
     add(cardPanel); 

     P1Rock.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       player1Choice = "Rock"; 
       cardLayout.show(cardPanel, "player2"); 
      } 
     }); 
     P1Paper.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       player1Choice = "Paper"; 
       cardLayout.show(cardPanel, "player2"); 
      } 
     }); 
     P1Scissors.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       player1Choice = "Scissors"; 
       cardLayout.show(cardPanel, "player2"); 
      } 
     }); 

     P2Rock.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       player2Choice = "Rock"; 
       checkWinner(); 
       result.setText(status); 
       cardLayout.show(cardPanel, "finish"); 
      } 
     }); 

     P2Paper.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       player2Choice = "Paper"; 
       checkWinner(); 
       result.setText(status); 
       cardLayout.show(cardPanel, "finish"); 
      } 
     }); 

     P2Scissors.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       player2Choice = "Scissors"; 
       checkWinner(); 
       result.setText(status); 
       cardLayout.show(cardPanel, "finish"); 
      } 
     }); 

     jbtPlay.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       player1Name = jtfname1.getText(); 
       player2Name = jtfname2.getText(); 
       jlblPlayer1.setText(player1Name + " choose: "); 
       jlblPlayer2.setText(player2Name + " choose: "); 
       cardLayout.show(cardPanel, "player1"); 

      } 
     }); 

     playAgain.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       cardLayout.show(cardPanel, "player1"); 
      } 
     }); 
    } 

    private void checkWinner(){ 
     if (player1Choice.equals(player2Choice)) 
      status = "It's a Tie!"; 
     else if ("Rock".equals(player1Choice) && "Paper".equals(player2Choice)) 
      status = player2Name + " wins. Paper beats Rock!"; 
     else if ("Rock".equals(player1Choice) && "Scissors".equals(player2Choice)) 
      status = player1Name + " wins. Rock beats Scissors!"; 
     else if ("Paper".equals(player1Choice) && "Rock".equals(player2Choice)) 
      status = player1Name + " wins. Paper beats Rock!"; 
     else if ("Paper".equals(player1Choice) && "Scissors".equals(player2Choice)) 
      status = player2Name + " wins. Scissors beats Paper!"; 
     else if ("Scissors".equals(player1Choice) && "Paper".equals(player2Choice)) 
      status = player1Name + " wins. Scissors beats Paper!"; 
     else if ("Scissors".equals(player1Choice) && "Rock".equals(player2Choice)) 
      status = player2Name + " wins. Rock beats Scissors!"; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 
       JFrame frame = new JFrame("Peeskillet's Rock, Paper, Scissors"); 
       frame.add(new PeeskilletsRPS()); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLocationRelativeTo(null); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

enter image description here enter image description here enter image description here enter image description here

+0

Я попробую это. Я пытаюсь сделать мой код чище, он просто запутался. Благодаря! – ZeroConnor

+0

Взгляните на мое Редактирование. Может быть, вы получите от него некоторые идеи. –

3

отлично работает для меня, но, возможно, что-то вы делаете, что вы не показываете нам ...

Cards

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestCardLayout100 { 

    public static void main(String[] args) { 
     new TestCardLayout100(); 
    } 

    public TestCardLayout100() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      final CardLayout cardLayout = new CardLayout(); 
      final JPanel cardPanel = new JPanel(cardLayout); 

      JPanel pname = new JPanel(); 

      JTextField p1name = new JTextField(20); 
      JTextField p2name = new JTextField(20); 

      pname.add(p1name); 
      pname.add(p2name); 

      cardPanel.add(pname, "pname"); 

      add(cardPanel); 

      cardLayout.show(cardPanel, "pname"); 
     } 

    } 
} 
0

Вы должны вызвать блок(), а затем перепроверить(). В вашем случае:

cardPanel.add(pname, "pname"); 
cardPanel.add(panel1, "player1"); 
cardPanel.add(panel2r, "player2r"); 
cardPanel.add(panel2p, "player2p"); 
cardPanel.add(panel2s, "player2s"); 
cardPanel.add(finish, "finish"); 

add(cardPanel); 

cardLayout.show(cardPanel, "pname"); 
pack(); 
revalidate(); 
Смежные вопросы