Java 使用其中一个面板内的按钮在面板之间切换
我有一个接收jpanel的JFrame,当程序启动时,它接收一个成功添加的jpanel,但是在这个面板中,当我尝试使用内部的按钮切换到另一个时,什么也没有发生 这是我的代码: 这是主面板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
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);
}