java – 不同大小的CardLayout
作者:互联网
好吧,我通过在每张卡上制作不同尺寸的CardLayout来解决问题.
读完The Use of Multiple JFrames: Good or Bad Practice?之后,我注意到我的做事方式并不合适,所以我决定开始学习如何使用CardLayout
我从@HovercraftFullOfEels尝试过this answer
This one来自@mKorbel
最后是@Kleopatra的answer
所有这些都是基于气垫船的答案,但有一些变化.我能够创建CardLayout(并且仍然对它感到困惑),并且我(以某种方式)可以实现Kleopatra的方法,它调整帧的大小但不应该如此,当复制和粘贴代码时,你会发现它减少了帧的尺寸只有几毫米(或像素).
我不确定这是关于我正在使用的布局管理器,还是因为我没有以正确的方式使用Kleopatra的方法,因为我也不知道@Override方法是如何工作的,或者何时工作使用它,何时不使用它.
这是一个MCVE(我能做的最短).
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);
}
}
}
所以,恢复(并在执行MCVE时添加了一些我想到的问题):
>为什么框架没有按预期调整大小?
>我使用正确的布局管理器吗?
>是我的lp.register.addActionListener(……或者我是这样做的
难?
提前致谢 :)
解决方法:
切换pack和setResizable调用. setResizable将改变某些系统上帧的边框大小,因此不是
frame.setResizable(false);
frame.pack();
你应该用…
frame.pack();
frame.setResizable(false);
调用之间差异的一个例子……
您可能还想实际使用PageViewer布局管理器…
cardLayout = new PageViewer();
现在,UI不应该像你拥有的那样包含在布局管理器中,它们应该分开,例如……
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class CardLayoutTest {
private static final String loginCard = "login";
private static final String userCard = "createUser";
private JFrame frame;
private CardLayout cardLayout;
private JPanel contentPane;
public static void main(String[] args) {
new CardLayoutTest();
}
public CardLayoutTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
createAndShowUI();
}
});
}
public void createAndShowUI() {
frame = new JFrame("Welcome");
cardLayout = new PageViewer();
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.setResizable(false);
frame.pack();
frame.setVisible(true);
}
public void createNewUser() {
cardLayout.show(contentPane, userCard);
}
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);
}
}
public class PageViewer extends 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;
}
}
}
标签:cardlayout,java,layout,swing,layout-manager 来源: https://codeday.me/bug/20191008/1870974.html