Mam JFRAME, który otrzymuje JPanels, gdy rozpocznie się program, recybracje, który został pomyślnie dodany, ale w tym panelu, gdy próbuję przełączyć się na inny za pomocą przycisku, nic się nie dzieje.

To mój kod:

To jest mainpanel

package Vista;


import javax.swing.JPanel;

/**
 *
 * @author harri
 */
public class MainPanel extends javax.swing.JFrame {

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

    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        panelframes = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panelframes.setLayout(new java.awt.BorderLayout());

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelframes, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 1280, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelframes, javax.swing.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE)
        );

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

    
    public void mostrarPanel(JPanel p) {
        panelframes.removeAll();//el panel principal se limpia en caso de que tenga otro jframe metido
        panelframes.add(p);
        panelframes.revalidate();//validacion en caso de error
        panelframes.repaint();//se encarga de imprimir ya lo del otro frame, acá
    }
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainPanel().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    public javax.swing.JPanel panelframes;
    // End of variables declaration                   

    
   
    
    
    public void sol() {
       mostrarPanel(new scene0());
       
       
       
    }
    
    public void loadscene1(){
        
        
    mostrarPanel(new scene1());
    
    }
}

To jest pozostałe 2 panele

package Vista;

import Vista.MainPanel;
import java.awt.Image;
import javax.swing.Icon;
import javax.swing.ImageIcon;

/**
 *
 * @author harri
 */
public class scene0 extends javax.swing.JPanel {

    /**
     * Creates new form scene0
     */
    public scene0() {
        
        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() {

        jLabel1 = new javax.swing.JLabel();

        setLayout(new java.awt.BorderLayout());

        jLabel1.setText("jLabel1");
        jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jLabel1MouseClicked(evt);
            }
        });
        add(jLabel1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                        

    private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
       MainPanel s = new MainPanel();
        scene1 r = new scene1();
        
        s.panelframes.removeAll();
        s.panelframes.revalidate();
        s.panelframes.repaint();
        
        
       s.loadscene1();
           
    }                                    


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


}

Pakiet Vista;

/ ** *

  • @author Harri. * / Scena klasa publiczna1 rozszerza javax.swing.jpanil {

    / **

    • tworzy nową scenę formularza1 * / publiczna scena1 () { inicjuszniki (); }

    / **

    • Ta metoda jest wywoływana w konstruktorze, aby zainicjować formularz.

    • OSTRZEŻENIE: Nie modyfikuj tego kodu. Zawartość tej metody jest zawsze

    • regenerowany przez edytor formularza. * / @SuppressWarmarnings ("niezaznaczone") //
      . Prywatne void initponents () {

      jlabel1 = nowy javax.swing.jlabel ();

      Setlayout (New Org.netbeans.lib.awtextra.absolutelayout ());

      jlabel1.setttekst ("mamalon"); Dodaj (JLABEL1, New Org.netbeans.lib.awtextra.absoluteConstandards (50, 80, 190, 120); } //

    // Deklaracja zmiennych - Nie modyfikuj
    prywatny javax.swing.jlabel jlabel1; // Koniec Deklaracji Zmiennych
    }

0
Harrison 01233 28 lipiec 2020, 23:28

1 odpowiedź

Najlepsza odpowiedź

Twój program działa

To znaczy, przełącza panele.

Powodem, dla którego nic się nie dzieje, gdy próbujesz przełączyć na inny panel za pomocą przycisku (za pomocą przycisku, JLabel za pomocą klasy {X1}}) } Metoda, tworzysz nową instancję MainPanel.

Tak więc, zamiast zmieniających paneli w już widocznym MainPanel, zmieniasz panele w nowej ramie {x1}}.

Rozwiązanie:

Chociaż istnieją inne rozwiązania, rozwiązanie, które mogłem pomyśleć o długim biegu, jest to, że należy utworzyć klasę głównej w pakiecie Vista. W tej klasie powinieneś stworzyć instancje wszystkich twoich paneli. Ilekroć uruchomisz swój program, uruchom tę klasę zamiast uruchamiania MainPanel klasa .

Kodeks demonstracyjny main klasa:

public class Main
{
 public static MainPanel mainPanel;
 public static scene0 firstScene  = new scene0();
 public static scene1 secondScene = new scene1();

 public static void main(String[] args)
 {
  java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
     mainPanel = new MainPanel()
   }
  });
 }
}

Teraz, gdy próbujesz uzyskać dostęp do MainPanel, scene0 lub scene1, uzyskaj dostęp do niego Main.mainPanel lub Main.scene0 lub Main.scene1.

Zmodyfikuj metodę jLabel1MouseClicked w ten sposób:

private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
  Main.mainPanel.loadscene1();         
}  

Należy również zmodyfikować metodę sol() i loadscene1() w ten sposób:

public void sol() {
 mostrarPanel(Main.firstScene);
}

public void loadscene1(){
 mostrarPanel(Main.secondScene);
}

Uwaga: Kod nie jest testowany, ale jestem pewien, że będzie działać.

1
Peter Parker 29 lipiec 2020, 03:41