2015-06-03 2 views
-1

Мне нужно сделать игру для школьного проекта в CS. Я хочу сделать так, чтобы человек мог ввести свое имя, и все последующие панели будут иметь на нем свое имя. Я использую макет карты, который работает по большей части. Когда я запускаю игру и вводю имя, она работает именно на этой карте. Однако, когда я перехожу на следующую карту, где должно появиться имя String, оно выглядит как null. Мое подозрение в том, что программа создает все карты, прежде чем дается возможность принять ввод имени и, следовательно, не работает. Мой учитель тоже не знает, как это сделать.Сделать замену JPanel после ActionListener

Вот сегмент кода:

import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    public class NovelCards extends JFrame { 
    private String name; 
    private CardLayout cards; 
    private JTextField txt = new JTextField(10); 
    private JLabel label = new JLabel(); 
    public NovelCards() { 
     super("Novel"); 
     masterPanel = new JPanel(); 
     cards = new CardLayout(); 
     txt.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
      name = txt.getText(); 
      label.setText(name); 
      } 
     });  
     button2 = new JButton("Next"); 
     button2.addActionListener(new NextListener()); 
     JPanel card2 = new JPanel(); 
     card2.add(button2); 
     card2.add(txt); 
     card2.add(label); 
     card2.add(new JLabel(" Enter your name ")); 

     JButton button3 = new JButton("Next"); 
     button3.addActionListener(new NextListener()); 
     JPanel card3 = new JPanel(); 
     card3.add(new JLabel("Hello there, " + name + "!")); 
     card3.add(button3); 

     masterPanel.setLayout(cards); 
     masterPanel.add("2",card2); 
     masterPanel.add("3",card3); 
     this.setContentPane(masterPanel); 
     cards.show(masterPanel, "1"); 
} 

public class NextListener implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
    cards.next(masterPanel); 
} 

Здесь также несколько фотографий программы при запуске.

Здесь имя входа экран после выбора имени и удара входят:

http://i.stack.imgur.com/AC446.png

И тогда вот последующая карта:

http://i.stack.imgur.com/Z1Jin.png

Заранее спасибо за помощь ! (Я бы сразу разместил изображения, но у меня недостаточно репутации)

ответ

4

Вопрос, который вам нужно задать себе, - как все остальные карты/панели узнают, что такое значение имени?

Простым решением было бы передать имя всем панелям. Это становится проблематичным, если вы хотите добавить новые карты/панели в, как вам нужно постоянно обновлять код, конечно, вы могли бы использовать List или массив, и есть все карты/панели реализовать общий интерфейс ...

Или вы можете просто использовать «модель» какого-то типа, к которой все карты/панели поделились ссылкой. Это позволит вам более просто обмениваться данными между ними, не прибегая к большому количеству

сделать класс, предпочтительно начиная с интерфейсом, который выступает в качестве контейнера для данных, это становится ваша модель ...

public interface NovelCardsModel { 
    public String getName(); 
    public void setName(String name); 

    public void addPropertyChangeListener(PropertyChangeListener listener); 
    public void removePropertyChangeListener(PropertyChangeListener listener); 

    // Add accessors to any other data you might think 
    // you need to share 
} 

Теперь создадим реализацию модели

public class DefaultNovelCardsModel implements NovelCardsModel { 
    private PropertyChangeSupport propertyChangeSupport; 
    private String name; 

    public DefaultNovelCardsModel() { 
     propertyChangeSupport = new PropertyChangeSupport(this); 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(String value) { 
     if (value == null || !value.equals(name)) { 
      String old = name; 
      name = value; 
      propertyChangeSupport.firePropertyChange("name", old, name); 
     } 
    } 

    @Override 
    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     propertyChangeSupport.addPropertyChangeListener(listener); 
    } 

    @Override 
    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     propertyChangeSupport.removePropertyChangeListener(listener); 
    } 


} 

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

DefaultNovelCardsModel model = new DefaultNovelCardsModel(); 
masterPanel = new MasterPane(model); 
// All the other cards. 

Каждая панель, которая хочет знать, когда изменения имени, они должны зарегистрировать PropertyChangeListener и следить за изменениями в name собственности

public class MasterPanel extends JPanel { 

    private NovelCardsModel model; 

    public MasterPanel(NovelCardsModel model) { 
     this.model = model; 
     this.model.addPropertyChangeListener(new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent evt) { 
       if ("name".equals(evt.getPropertyName())) { 
        // Name has changed 
       } 
      } 
     }); 
    } 

} 
+0

Спасибо за понимание! Я очень новичок в коде, поэтому, если бы вы могли направить меня к тому, что мне нужно, чтобы научиться передавать имя на другую панель? – BananaCreamDream