Buat Perubahan JPanel Setelah ActionListener

Saya harus membuat game untuk proyek sekolah di CS. Saya ingin membuatnya agar seseorang dapat memasukkan namanya dan semua panel berikutnya akan mencantumkan namanya. Saya menggunakan tata letak kartu, yang sebagian besar berfungsi. Ketika saya menjalankan permainan dan memasukkan namanya, itu bekerja secara khusus pada kartu itu. Namun, ketika saya pergi ke kartu berikutnya, di mana nama String seharusnya muncul, itu muncul sebagai nol. Kecurigaan saya adalah bahwa program tersebut membuat semua kartu sebelum diberi kesempatan untuk menerima masukan nama dan oleh karena itu gagal. Guru saya juga tidak begitu tahu bagaimana melakukannya.

Berikut adalah segmen kodenya:

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

Berikut juga beberapa foto program saat dijalankan.

Berikut adalah layar memasukkan nama setelah memilih nama dan menekan enter:

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

Dan inilah kartu berikutnya:

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

Terima kasih sebelumnya atas bantuannya! (Saya akan langsung memposting gambarnya tetapi saya tidak memiliki reputasi yang cukup)


person BananaCreamDream    schedule 03.06.2015    source sumber


Jawaban (1)


Pertanyaan yang perlu Anda tanyakan pada diri Anda adalah, bagaimana semua kartu/panel lainnya mengetahui nilai dari nama tersebut?

Solusi sederhananya adalah dengan meneruskan nama ke semua panel. Ini menjadi masalah ketika Anda ingin menambahkan kartu/panel baru, karena Anda harus terus memperbarui kode, tentu saja, Anda dapat menggunakan List atau array dan membuat semua kartu/panel mengimplementasikan antarmuka yang umum...

Atau Anda bisa menggunakan semacam "model", yang menjadi referensi semua kartu/panel. Ini akan memungkinkan Anda lebih mudah berbagi data di antara mereka tanpa harus banyak dipusingkan

jadi jika Anda mungkin bisa mengarahkan saya ke apa yang perlu saya pelajari untuk meneruskan nama ke panel lain?

Buatlah sebuah kelas, sebaiknya dimulai dengan antarmuka, yang bertindak sebagai wadah untuk data, ini menjadi model Anda...

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
}

Sekarang, buat implementasi modelnya

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


}

Untuk setiap panel yang perlu mengetahui namanya, Anda harus meneruskan contoh model yang sama ke panel tersebut...

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

Setiap panel yang ingin mengetahui kapan namanya berubah, mereka perlu mendaftarkan PropertyChangeListener dan memantau perubahan pada properti 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
                }
            }
        });
    }

}
person MadProgrammer    schedule 03.06.2015
comment
Terima kasih untuk wawasan! Saya sangat pemula dalam bidang kode, jadi jika Anda bisa mengarahkan saya ke apa yang perlu saya pelajari untuk meneruskan nama ke panel lain? - person BananaCreamDream; 04.06.2015