Java 使用其中一个面板内的按钮在面板之间切换

Java 使用其中一个面板内的按钮在面板之间切换,java,swing,netbeans,Java,Swing,Netbeans,我有一个接收jpanel的JFrame,当程序启动时,它接收一个成功添加的jpanel,但是在这个面板中,当我尝试使用内部的按钮切换到另一个时,什么也没有发生 这是我的代码: 这是主面板 package Vista; import javax.swing.JPanel; /** * * @author harri */ public class MainPanel extends javax.swing.JFrame { /** * Creates new for

我有一个接收jpanel的JFrame,当程序启动时,它接收一个成功添加的jpanel,但是在这个面板中,当我尝试使用内部的按钮切换到另一个时,什么也没有发生

这是我的代码:

这是主面板

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());
    
    }
}
你的程序有效 也就是说,它切换面板

当您尝试使用
scene0
类中的按钮(您所说的按钮是指带有
MouseListener的
JLabel
)切换到另一个面板时,没有发生任何事情的原因是,在
jlabelmouseclicked
方法中,您实际上正在创建
MainPanel
的新实例

因此,您不是在已经可见的
MainPanel
中更改面板,而是在新的
MainPanel
框架中更改面板

解决方案: 尽管还有其他解决方案,但从长远来看,我认为应该在
Vista
包中创建一个Main类。在该类中,您应该创建所有面板的实例。无论何时,只要运行程序,运行该类,而不是运行
MainPanel
class

主类的演示代码:

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()
   }
  });
 }
}
现在,无论何时尝试访问
主面板
scene0
scene1
,请使用
Main.Main面板
Main.scene0
Main.scene1

以以下方式修改
jlabelmouseclicked
方法:

private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
  Main.mainPanel.loadscene1();         
}  
您还应该以以下方式修改
sol()
loadscene1()
方法:

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

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

注意:代码未经测试,但我确信它会工作。

请在问题末尾格式化代码。只保留相关细节以显示问题,例如,某些注释可以清理,如作者。不要使用IDE生成代码。GroupLayout不便于交换组件。相反,您需要使用
卡片布局
,这意味着您需要手动编写代码来创建组件并将其添加到框架中。有关更多信息和工作示例,请阅读上Swing教程的部分。
private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
  Main.mainPanel.loadscene1();         
}  
public void sol() {
 mostrarPanel(Main.firstScene);
}

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