Well, I have problems making it CardLayoutwith different sizes on each map.
After reading Using multiple JFrames: good or bad practice? I noticed that I was doing something that was not an apiopath, so I decided to start learning how to use CardLayout
I tried this answer from @HovercraftFullOfEels
This one from @mKorbel
Finally, @Kleopatra answer
All of them are based on the answer on Hovercraft, but with some changes. I was able to create a CardLayout (and still messed up), and I (somehow) could implement the Kleopatra method, it changes the frame size, but not as it should, when you copy and paste the code, you will notice that it reduces the frame size just a few millimeters (or pixels).
I am not sure if this applies to the layout managers that I use, or because I do not use the Kleopatra methods in the right way, since I also don’t know how the method works @Overrideall or when to use it, and when not to use it.
Here's MCVE (the shortest I could do).
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
public class PageViewer extends CardLayout{
private static final String loginCard = "login";
private static final String userCard = "createUser";
JFrame frame;
JPanel contentPane;
CardLayout cardLayout;
@Override
public Dimension preferredLayoutSize(Container parent) {
Component current = findCurrentComponent(parent);
if (current != null) {
Insets insets = parent.getInsets();
Dimension pref = current.getPreferredSize();
pref.width += insets.left + insets.right;
pref.height += insets.top + insets.bottom;
return pref;
}
return super.preferredLayoutSize(parent);
}
public Component findCurrentComponent(Container parent) {
for (Component comp : parent.getComponents()) {
if (comp.isVisible()) {
return comp;
}
}
return null;
}
public void createAndShowUI() {
frame = new JFrame("Welcome");
cardLayout = new CardLayout();
contentPane = new JPanel(cardLayout);
LoginPage lp = new LoginPage();
CreateUser cu = new CreateUser();
lp.register.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
createNewUser();
frame.pack();
}
});
contentPane.add(lp, loginCard);
contentPane.add(cu, userCard);
frame.add(contentPane, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(150, 150);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
PageViewer() {
createAndShowUI();
}
public void createNewUser() {
cardLayout.show(contentPane, userCard);
}
public static void main(String[] args) {
new PageViewer();
}
public class LoginPage extends JPanel {
Image image;
ImageIcon imageIcon;
JPanel userPanel;
JPanel passwordPanel;
JPanel buttonsPanel;
JPanel fieldsPanel;
JFrame frame;
JLabel usernameLabel;
JLabel passwordLabel;
JLabel logo;
JTextField usernameField;
JPasswordField passwordField;
JButton login;
JButton register;
public LoginPage() {
image = Toolkit.getDefaultToolkit().getImage("image.jpg");
imageIcon = new ImageIcon("image.jpg");
userPanel = new JPanel();
passwordPanel = new JPanel();
buttonsPanel = new JPanel();
fieldsPanel = new JPanel();
usernameLabel = new JLabel("username:");
passwordLabel = new JLabel("password:");
logo = new JLabel(imageIcon);
usernameField = new JTextField();
passwordField = new JPasswordField();
login = new JButton("Login");
register = new JButton("Register");
this.setLayout(new BorderLayout(10, 15));
this.setBorder(new EmptyBorder(10, 10, 10, 10));
fieldsPanel.setLayout(new BorderLayout());
usernameField.setColumns(8);
passwordField.setColumns(8);
userPanel.add(usernameLabel);
userPanel.add(usernameField);
passwordPanel.add(passwordLabel);
passwordPanel.add(passwordField);
fieldsPanel.add(userPanel, BorderLayout.CENTER);
fieldsPanel.add(passwordPanel, BorderLayout.SOUTH);
buttonsPanel.add(login);
buttonsPanel.add(register);
this.add(logo, BorderLayout.NORTH);
this.add(fieldsPanel, BorderLayout.CENTER);
this.add(buttonsPanel, BorderLayout.SOUTH);
}
}
public class CreateUser extends JPanel {
JPanel userPanel;
JPanel passPanel;
JPanel repPassPanel;
JPanel buttonsPanel;
JPanel fieldsPanel;
JLabel username;
JLabel password;
JLabel repPassword;
JTextField userField;
JPasswordField passField;
JPasswordField repPassField;
JButton acceptButton;
JButton cancelButton;
public CreateUser() {
userPanel = new JPanel();
passPanel = new JPanel();
repPassPanel = new JPanel();
buttonsPanel = new JPanel();
fieldsPanel = new JPanel();
username = new JLabel("username: ");
password = new JLabel("password: ");
repPassword = new JLabel("repeat password: ");
userField = new JTextField();
passField = new JPasswordField();
repPassField = new JPasswordField();
acceptButton = new JButton("Accept");
cancelButton = new JButton("Cancel");
userField.setColumns(8);
passField.setColumns(8);
repPassField.setColumns(8);
userPanel.add(username);
userPanel.add(userField);
passPanel.add(password);
passPanel.add(passField);
repPassPanel.add(repPassword);
repPassPanel.add(repPassField);
buttonsPanel.add(acceptButton);
buttonsPanel.add(cancelButton);
fieldsPanel.setLayout(new BoxLayout(fieldsPanel, BoxLayout.Y_AXIS));
this.setLayout(new BorderLayout(10, 15));
this.setBorder(new EmptyBorder(10, 10, 10, 10));
fieldsPanel.add(userPanel);
fieldsPanel.add(passPanel);
fieldsPanel.add(repPassPanel);
this.add(fieldsPanel, BorderLayout.CENTER);
this.add(buttonsPanel, BorderLayout.SOUTH);
}
}
}
So, resuming (and adding a few more questions that come to my mind when doing MCVE):
- Why does the frame not change as expected?
- Am I using the right layout managers?
lp.register.addActionListener(... ,
?
:)