CardLayout与netbeans使用多个外部jpanel

时间:2014-05-26 13:15:27

标签: java swing netbeans cardlayout gui-builder

我希望在我的JFrame表单中使用CardLayout来交换JPanel 这是JFrame表单的代码:

public class Login extends javax.swing.JFrame {

/**
 * Creates new form Login
 */

public Login() {
    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() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

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

/**
 * @param args the command line arguments
 */
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(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Login.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 Login().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
// End of variables declaration                   

}

JFrame启动时加载的第一个JPanel是:

public class LoginPanel extends javax.swing.JPanel {
private Font original;

/**
 * Creates new form LoginPanel
 */



public LoginPanel() {
    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() {

    Email = new javax.swing.JLabel();
    emailField = new javax.swing.JTextField();
    login = new javax.swing.JButton();
    password = new javax.swing.JLabel();
    passwordField = new javax.swing.JPasswordField();
    register = new javax.swing.JLabel();
    background = new javax.swing.JLabel();

    setLayout(null);

    Email.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    Email.setText("Email address");
    add(Email);
    Email.setBounds(155, 115, 90, 14);

    emailField.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            emailFieldMouseEntered(evt);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            emailFieldMouseExited(evt);
        }
    });
    add(emailField);
    emailField.setBounds(115, 135, 170, 20);

    login.setText("Login");
    add(login);
    login.setBounds(156, 240, 90, 23);

    password.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    password.setText("Password");
    add(password);
    password.setBounds(155, 170, 90, 14);
    add(passwordField);
    passwordField.setBounds(115, 191, 170, 20);

    register.setForeground(new java.awt.Color(0, 0, 255));
    register.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    register.setText("Don't have an account? Register!");
    register.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            registerMouseClicked(evt);
        }
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            registerMouseEntered(evt);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            registerMouseExited(evt);
        }
    });
    add(register);
    register.setBounds(115, 220, 170, 14);

    background.setIcon(new javax.swing.ImageIcon("C:\\Users\\Matteo\\Desktop\\Netbeans Project\\Social_Network\\background.png")); // NOI18N
    background.setText("jLabel1");
    add(background);
    background.setBounds(0, 0, 400, 300);
}// </editor-fold>                        

private void registerMouseClicked(java.awt.event.MouseEvent evt) {                                      

}                                     

private void registerMouseEntered(java.awt.event.MouseEvent evt) {                                      
    original = register.getFont();
    Map attributes = original.getAttributes();
    attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
    register.setFont(original.deriveFont(attributes));
    Cursor cursor = Cursor.getDefaultCursor();
    cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
    setCursor(cursor);
}                                     

private void registerMouseExited(java.awt.event.MouseEvent evt) {                                     
    register.setFont(original);
    Cursor cursor = Cursor.getDefaultCursor();
    setCursor(cursor);
}                                    

private void emailFieldMouseEntered(java.awt.event.MouseEvent evt) {                                        
    Cursor cursor = Cursor.getDefaultCursor();
    cursor = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
    setCursor(cursor);
}                                       

private void emailFieldMouseExited(java.awt.event.MouseEvent evt) {                                       
   Cursor cursor = Cursor.getDefaultCursor();
   setCursor(cursor);
}                                      


// Variables declaration - do not modify                     
private javax.swing.JLabel Email;
private javax.swing.JLabel background;
private javax.swing.JTextField emailField;
private javax.swing.JButton login;
private javax.swing.JLabel password;
private javax.swing.JPasswordField passwordField;
private javax.swing.JLabel register;
// End of variables declaration                   

}

点击按钮时要交换的第二个JPanel:

public class RegisterPanel extends javax.swing.JPanel {

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

    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jTextField4 = new javax.swing.JTextField();
    jPasswordField1 = new javax.swing.JPasswordField();
    register = new javax.swing.JButton();
    cancel = new javax.swing.JButton();
    Name = new javax.swing.JLabel();
    LastName = new javax.swing.JLabel();
    Email = new javax.swing.JLabel();
    Password = new javax.swing.JLabel();
    icon = new javax.swing.JLabel();
    jPasswordField2 = new javax.swing.JPasswordField();
    repeatPassword = new javax.swing.JLabel();
    jLabel1 = new javax.swing.JLabel();

    setToolTipText("");
    setPreferredSize(new java.awt.Dimension(400, 300));
    setLayout(null);
    add(jTextField1);
    jTextField1.setBounds(110, 60, 240, 20);
    add(jTextField2);
    jTextField2.setBounds(110, 100, 240, 20);
    add(jTextField4);
    jTextField4.setBounds(110, 140, 240, 20);
    add(jPasswordField1);
    jPasswordField1.setBounds(110, 180, 240, 20);

    register.setIcon(new javax.swing.ImageIcon("C:\\Users\\Matteo\\Desktop\\Netbeans Project\\Social_Network\\cancel.png")); // NOI18N
    register.setText("Cancel");
    register.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            registerMouseClicked(evt);
        }
    });
    add(register);
    register.setBounds(240, 260, 90, 25);

    cancel.setIcon(new javax.swing.ImageIcon("C:\\Users\\Matteo\\Desktop\\Netbeans Project\\Social_Network\\confirm.png")); // NOI18N
    cancel.setText("Register");
    add(cancel);
    cancel.setBounds(130, 260, 93, 25);

    Name.setText("Name");
    add(Name);
    Name.setBounds(20, 60, 27, 14);

    LastName.setText("Last name");
    add(LastName);
    LastName.setBounds(20, 100, 60, 14);

    Email.setText("Email address");
    add(Email);
    Email.setBounds(20, 140, 70, 14);

    Password.setText("Password");
    add(Password);
    Password.setBounds(20, 180, 50, 14);

    icon.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
    icon.setIcon(new javax.swing.ImageIcon("C:\\Users\\Matteo\\Desktop\\Netbeans Project\\Social_Network\\addUser.png")); // NOI18N
    icon.setText("     Registration user");
    add(icon);
    icon.setBounds(20, 10, 180, 40);
    add(jPasswordField2);
    jPasswordField2.setBounds(110, 220, 240, 20);

    repeatPassword.setText("Repeat password");
    add(repeatPassword);
    repeatPassword.setBounds(20, 220, 90, 14);

    jLabel1.setIcon(new javax.swing.ImageIcon("C:\\Users\\Matteo\\Desktop\\Netbeans Project\\Social_Network\\background.png")); // NOI18N
    jLabel1.setText("jLabel1");
    add(jLabel1);
    jLabel1.setBounds(0, 0, 400, 300);
}// </editor-fold>                        

private void registerMouseClicked(java.awt.event.MouseEvent evt) {                                      

}                                     


// Variables declaration - do not modify                     
private javax.swing.JLabel Email;
private javax.swing.JLabel LastName;
private javax.swing.JLabel Name;
private javax.swing.JLabel Password;
private javax.swing.JButton cancel;
private javax.swing.JLabel icon;
private javax.swing.JLabel jLabel1;
private javax.swing.JPasswordField jPasswordField1;
private javax.swing.JPasswordField jPasswordField2;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField4;
private javax.swing.JButton register;
private javax.swing.JLabel repeatPassword;
// End of variables declaration                   

}

单击按钮时,如何编写交换JPanel?

1 个答案:

答案 0 :(得分:1)

您需要访问CardLayout实例并使用布局的show(...),添加传递给您要显示的面板的名称。 How to Use CardLayout已明确说明这一点。

另见How to Use CardLayout with Netbeans GUI Builder了解

  • 如何使用构建器工具
  • 设置面板的名称
  • 如何通常使用Bulder工具使用CardLayout

另见this answer了解

  • 如果您遇到问题
  • ,如何拖放面板

<强>更新

如果要从面板内部调用CardLayout,可以使用要显示的方法创建要实现的界面。让具有CardLayout的类实现它,并将框架的实例传递给面板类似

public interface Switchable {
    void show(String card);
}

public class Login extends JFrame implements Switchable {
    LoginPanel panel = new LoginPanel(this);

    @Override
    public void show(String card) {
        CardLayout layout = (CardLayout)getLayout();
        layout.show(card);
    }
}

public class LoginPanel extends JPanel {
    private Switchable switcher;

    public LoginPanel(Switchable switcher) {
        this.switcher = switcher;
    }

    private void buttonActionPerformed(ActionEvent e) {
        switcher.show(...);
    }
}