Zmiana panelu

0

Witam.

Mam prosty programik, ktory zawiera JFrame. Na nim oczywiście jest osadzony JPanel z jakimiś komponentami. Mam również drugi JPanel. Chciałbym, aby po wciśnięciu przycisku na Panelu 1 w tym samym oknie wyświetlał się panel 2. Przycisk w Panelu 2 powoduje powrót do 1 i tak dalej, i tak dalej. Nie mogę sobie z tym poradzić... Stworzyłem niby jakiś kod, ale jak się okazuje działa tylko w jedną stronę ;)

oknoGry.java

import javax.swing.JPanel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * oknoGry.java
 *
 * Created on 2009-10-20, 10:39:30
 */

/**
 *
 * @author Karex
 */
public class oknoGry extends javax.swing.JFrame {

    /** Creates new form oknoGry */
    public oknoGry() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jEditorPane1 = new javax.swing.JEditorPane();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        jScrollPane1.setViewportView(jEditorPane1);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(394, 423));

        jPanel1.setMaximumSize(new java.awt.Dimension(394, 423));
        jPanel1.setMinimumSize(new java.awt.Dimension(394, 423));
        jPanel1.setPreferredSize(new java.awt.Dimension(394, 423));

        jLabel1.setFont(new java.awt.Font("Algerian", 0, 36)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("TurboDymoBlaster");

        jButton1.setText("Nowa Gra");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Pomoc");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setText("Wyjście");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(120, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(138, 138, 138))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(60, 60, 60)
                .addComponent(jLabel1)
                .addGap(51, 51, 51)
                .addComponent(jButton1)
                .addGap(59, 59, 59)
                .addComponent(jButton2)
                .addGap(60, 60, 60)
                .addComponent(jButton3)
                .addContainerGap(65, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 384, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 412, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
}

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
}

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        JPanel pomoc=new Pomoc();
        pomoc.setVisible(true);
        setContentPane(pomoc);
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new oknoGry().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JEditorPane jEditorPane1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration

}

Pomoc.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Pomoc.java
 *
 * Created on 2009-10-20, 10:46:18
 */

/**
 *
 * @author Karex
 */
public class Pomoc extends javax.swing.JPanel {

    /** Creates new form Pomoc */
    public Pomoc() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setMinimumSize(new java.awt.Dimension(394, 423));
        setPreferredSize(new java.awt.Dimension(394, 423));

        jPanel1.setMaximumSize(new java.awt.Dimension(394, 423));
        jPanel1.setMinimumSize(new java.awt.Dimension(394, 423));
        jPanel1.setPreferredSize(new java.awt.Dimension(394, 423));

        jLabel1.setFont(new java.awt.Font("Algerian", 0, 36)); // NOI18N
        jLabel1.setText("POMOC");

        jButton1.setText("Powrót do menu");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(136, 136, 136)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel1)
                    .addComponent(jButton1))
                .addContainerGap(146, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(104, 104, 104)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 68, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(180, 180, 180))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
    }// </editor-fold>


    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration

}
0

Musisz sobie zarejestrować listenera dla przycisku Pomoc.jbutton1 tak samo jak zrobiłeś to dla oknoGry.jbutton1 (i 2, 3). Możesz zmieniać panele do woli - ale robienie tego przez setContentPane, to raczej najgorsze rozwiązanie dlatego, że same panele nic o tym nie wiedzą i nie potrafią dobrze aktualizować komponentów ekranowych, które reprezentują jako obiekty Javy.

Tworzeniem komponentu na ekranie czyli zasobu Windows lub zasobu graficznego biblioteki Swinga zajmuje się wywołanie setVisible(true), a więc kiedy już komponent wyświetlisz, to jedyne co można zrobić, to go aktualizować, albo schować lub usunąć. Choć pozornie wydaje się, że klasa JButton reprezentuje przycisk widziany na ekranie, to jest to tylko uproszczenie. JButton organizuje komunikację z zasobem graficznym przycisku - nie jest przyciskiem jako takim. Dlatego jeżeli użyjesz steContentPane, to referencja do obiektu panelu zostaje przepisana, ale sam komponent ekranowy nie ma pojęcia o tym, że został przepięty gdzieś indziej (chyba, że go się zaktualizuje np. metodą taką jak np. validate(). A tym samym na ekranie nie będzie widać zmiany. Dlatego najlepiej używać getContentPane().remove() do usuwania komponentu (panelu) z komponenentu, który to wszystko mieści oraz getContentPane().add() do dodawania komponentu (panelu). To pozwoli tym panelom otrzymać zdarzenie obsługiwane przed addNotify() oraz removeNotify(), które przeprowadzają prawdziwą komunikację z komponentem ekranowym pojemnika (okna lub innego panelu).

W tym wypadku najlepiej jest panel Pomoc "dodać" do okienka, co powinno być jak dotychczas obsługiwane w metodzie jButton2ActionPerformed(), a w obsłudze Pomoc.jbutton2() (też actionPerformed) usunąć siebie samego (czyli obiekt utworzony z klasy Pomoc) z zawartości okienka rodzica, czyli obecnie z obiektu oknoGry utworzonego w klasie anonimowej metody main().

Trzeba też przy takim przełączaniu uważać, aby nie zrobić z okienek i paneli matrioszki - czyli takiego przypadku, że w jednym panelu wrzucamy drugi panel, w nim znowu ten pierwszy, a potem znowu drugi itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1