Philip Woulfe
Philip Woulfe

Reputation: 93

Multiple JPanel Java Application Windows


Edited to make the code work


This might get closed a a dupe, anyway.

I'm trying to create an application for an assignment. I could just do the easy thing and use multiple JFrames but I don't want to do that.

I want an application with a login screen, a customer screen and an admin screen. I though I could just use JPanels and swap them as required, I can remove the login panel but can't add the customer panel.

Curently, the application starts as expected with the login JPanel enter image description here

But when I click on ok, it's supposed to close the JPanel and open the customer Jpanel, instead it just closes the login panel.

enter image description here

package projFlight;

import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import java.awt.Color;
import java.awt.BorderLayout;
import javax.swing.UIManager;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon;

public class GUIMain {

GUIMainEvent event = new GUIMainEvent(this);

JFrame frame;
GUILoginScreen login = new GUILoginScreen();
GUICustomerScreen custScreen = new GUICustomerScreen();


/**
 * Launch the application.
 */
public static void main(String[] args) {
    GUIMain window = new GUIMain();
    window.frame.setVisible(true);
}

/**
 * Create the application.
 */
public GUIMain() {
    setLookAndFeel();
    initialize();
    controller.start();
}

// The thread controlling changes of panels in the main window. 
private Thread controller = new Thread() { 
    public void run() { 


        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 

                frame.getContentPane().add(login); 
                addLogo(login);
                frame.revalidate();

            } 
        });


    }
}; 




/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.getContentPane().setBackground(Color.BLUE);
    frame.getContentPane().setLayout(new BorderLayout(0, 0));
    frame.setBounds(100, 100, 406, 473);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

private void addLogo(JPanel panel) {
    BufferedImage myPicture = null;
    try {
        myPicture = ImageIO.read(new File("C:\\Users\\Phil\\workspace\\projFlight\\Pictures\\WolfLogo.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //The below line was causing the issue
    //frame.getContentPane().setLayout(null);

    JLabel picLabel = new JLabel(new ImageIcon(myPicture));
    picLabel.setBounds(0, 0, 170, 128);
    panel.add(picLabel);

    //frame.getContentPane().add(login);
    login.btnOk.addActionListener(event); //These also shouldn't be here
    login.btnCancel.addActionListener(event); //These also shouldn't be here
}

// method to set the look and feel of the GUI
private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Exception exc) {
        // ignore error
    }
}
}

/**
 * 
 */
package projFlight;

import java.awt.event.ActionListener;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;

/**
 * @author Phil
 *
 */
public class GUIMainEvent implements ActionListener{

GUIMain gui; 

GUIMainEvent(GUIMain in) {
    gui = in;
}

@Override
public void actionPerformed(ActionEvent event) {
    // TODO Auto-generated method stub
    Object source = event.getSource();

    if (source == gui.login.btnOk) {

        gui.frame.getContentPane().remove(gui.login);
        gui.frame.repaint();
        gui.frame.getContentPane().add(gui.custScreen);
        gui.custScreen.setVisible(true);
        gui.frame.repaint();
        gui.frame.revalidate();

    } else if (source == gui.login.btnCancel) {
        System.exit(0);
    }
}

}


package projFlight;

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JTextField;  
import javax.swing.UIManager;
import javax.swing.JPasswordField;
import javax.swing.JButton;

public class GUILoginScreen extends JPanel {
/**
 * 
 */
private static final long serialVersionUID = 1L;
JTextField tboUsername;
JPasswordField passwordField;
JButton btnOk;
JButton btnCancel;

/**
 * Create the panel.
 */
public GUILoginScreen() {
    setBackground(Color.DARK_GRAY);
    setLayout(null);
    setLookAndFeel();



    JLabel lblUsername = new JLabel("Username");
    lblUsername.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    lblUsername.setBounds(77, 170, 109, 35);
    add(lblUsername);

    JLabel lblPassword = new JLabel("Password");
    lblPassword.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    lblPassword.setBounds(77, 235, 109, 35);
    add(lblPassword);

    tboUsername = new JTextField();
    tboUsername.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    tboUsername.setBounds(77, 203, 241, 31);
    add(tboUsername);
    tboUsername.setColumns(10);

    passwordField = new JPasswordField();
    passwordField.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    passwordField.setBounds(77, 268, 241, 31);
    add(passwordField);

    btnOk = new JButton("OK");
    btnOk.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    btnOk.setBounds(77, 349, 109, 35);
    add(btnOk);


    btnCancel = new JButton("Cancel");
    btnCancel.setFont(new Font("Segoe UI Black", Font.ITALIC, 18));
    btnCancel.setBounds(209, 349, 109, 35);
    add(btnCancel);


}

// method to set the look and feel of the GUI
    private void setLookAndFeel() {
        try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception exc) {
            // ignore error
        }
    }
}

package projFlight;

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Font;

public class GUICustomerScreen extends JPanel {

/**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * Create the panel.
 */

String firstName = "Phil";

public GUICustomerScreen() {
    setLayout(null);

    JLabel lblHello = new JLabel("Hello " + firstName);
    lblHello.setFont(new Font("Segoe UI Black", Font.ITALIC, 14));
    lblHello.setBounds(184, 11, 107, 27);
    add(lblHello);

}

} 

Upvotes: 0

Views: 695

Answers (2)

Francisunoxx
Francisunoxx

Reputation: 1458

You should not use a multiple JFrame. You will encounter a lot of error. Try this use JDialog for your login frame and use GridBagLayout to make your components flexible. setBounds it not flexible sometimes it make components crumbled.

GridBagLayout: https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

Sample Code

public class Login extends JDialog{

MainLoginFrame mainloginframe = new MainLoginFrame();

//Constructor
public Login(){
    setSize(330,150);
    setTitle("Login Sample");
    setVisible(true);
    setResizable(false);
    setLocationRelativeTo(null);
    getContentPane().add(mainloginframe);
}

    public class MainLoginFrame extends JPanel{

    //Create Labels
    JLabel usernameLabel = new JLabel("Username:");
    JLabel passwordLabel = new JLabel("Password:");
    //Create TextField
    JTextField usernameTextField = new JTextField(10);
    JPasswordField passwordPasswordField = new JPasswordField(10);
    //Create Button
    JButton loginButton = new JButton("Login");
    JButton clearButton = new JButton("Clear");
    JButton exitButton = new JButton("Exit");
    //Create ComboBox
    String[] selectUser = {"Administrator","Registrar"};
    JComboBox listUser = new JComboBox(selectUser);
    //Constraints
    GridBagConstraints usernameLabelConstraints = new GridBagConstraints();
    GridBagConstraints passwordLabelConstraints = new GridBagConstraints();
    GridBagConstraints userTypeConstraints = new GridBagConstraints();
    GridBagConstraints usernameTfConstraints = new GridBagConstraints();
    GridBagConstraints passwordPfConstraints = new GridBagConstraints();
    GridBagConstraints loginConstraints = new GridBagConstraints();
    GridBagConstraints clearConstraints = new GridBagConstraints();
    GridBagConstraints exitConstraints = new GridBagConstraints();

   //Constructor
   public MainLoginFrame(){
    setLayout(new GridBagLayout());

    usernameLabelConstraints.anchor = GridBagConstraints.LINE_START;
    usernameLabelConstraints.weightx = 0.5;
    usernameLabelConstraints.weighty = 0.5;
    add(usernameLabel,usernameLabelConstraints);

    passwordLabelConstraints.anchor = GridBagConstraints.LINE_START;
    passwordLabelConstraints.weightx = 0.5;
    passwordLabelConstraints.weighty = 0.5;
    passwordLabelConstraints.gridx = 0;
    passwordLabelConstraints.gridy = 1;
    add(passwordLabel,passwordLabelConstraints);

    usernameTfConstraints.anchor = GridBagConstraints.LINE_START;
    usernameTfConstraints.weightx = 0.5;
    usernameTfConstraints.weighty = 0.5;
    usernameTfConstraints.gridx = 1;
    usernameTfConstraints.gridy = 0;
    add(usernameTextField,usernameTfConstraints);

    passwordPfConstraints.anchor = GridBagConstraints.LINE_START;
    passwordPfConstraints.weightx = 0.5;
    passwordPfConstraints.weighty = 0.5;
    passwordPfConstraints.gridx = 1;
    passwordPfConstraints.gridy = 1;
    add(passwordPasswordField,passwordPfConstraints);

    userTypeConstraints.anchor = GridBagConstraints.LINE_START;
    userTypeConstraints.weightx = 0.5;
    userTypeConstraints.weighty = 0.5;
    userTypeConstraints.gridx = 1;
    userTypeConstraints.gridy = 2;
    add(listUser,userTypeConstraints);

    loginConstraints.anchor = GridBagConstraints.LINE_START;
    loginConstraints.weightx = 0.5;
    loginConstraints.weighty = 0.5;
    loginConstraints.gridx = 1;
    loginConstraints.gridy = 3;
    add(loginButton,loginConstraints);

    clearConstraints.anchor = GridBagConstraints.LINE_START;
    clearConstraints.weightx = 0.5;
    clearConstraints.weighty = 0.5;
    clearConstraints.gridx = 2;
    clearConstraints.gridy = 3;
    add(clearButton,clearConstraints);

    exitConstraints.anchor = GridBagConstraints.LINE_START;
    exitConstraints.weightx = 0.5;
    exitConstraints.weighty = 0.5;
    exitConstraints.gridx = 3;
    exitConstraints.gridy = 3;
    add(exitButton,exitConstraints);
    }

Upvotes: 0

camickr
camickr

Reputation: 324197

I though I could just use JPanels and swap them as required,

You can use a CardLayout to do this.

Check out the section from the Swing tutorial on How to Use CardLayout for a working demo.

Upvotes: 2

Related Questions