gpt4 book ai didi

java - 如何在 CardLayout Swap 上将一张卡片的文本字段值显示到另一张卡片

转载 作者:行者123 更新时间:2023-12-02 07:42:30 24 4
gpt4 key购买 nike

我试图在用户登录后在下一张卡片上显示用户名,但没有成功。

我正在使用 CardLayout 并定义了两张卡片 - 一张用于用户输入名称和密码的卡片,第二张用于显示带有已登录用户名的欢迎消息。我自己学习 Java 和 Swing,而不是专家。任何帮助,包括修复此代码或供我阅读的引用,都将不胜感激。

这是我当前的代码(仍然需要添加代码来更新欢迎屏幕的文本字段):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardTest
{
private JFrame frame;
public static final String CARD_LOGIN = "Card Login";
public static final String CARD_DEPARTMENT = "Card Department";
public static final String CARD_TEAM = "Card Team";
public static JPanel cards;
public Employee employee = null;
public CardLogin cardLogin = null;
public CardDepartment cardDepartment = null;
public CardTeam cardTeam = null;

public CardTest()
{
Employee employee = new Employee();

frame = new JFrame("Card Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);

cards = new JPanel();
cards.setLayout(new CardLayout(20, 20));

cardLogin = new CardLogin(this, employee);
cardDepartment = new CardDepartment(this, employee);
cardTeam = new CardTeam(this, employee);

cards.add(cardLogin, CARD_LOGIN);
cards.add(cardDepartment, CARD_DEPARTMENT);
cards.add(cardTeam, CARD_TEAM);

frame.getContentPane().add(cards);
frame.pack();
frame.setVisible(true);
}

public void swapView(String key)
{
CardLayout cardLayout = (CardLayout) cards.getLayout();
cardLayout.show(cards, key);
}

public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CardTest();
}
});
}
}

class CardLogin extends JPanel
{
private ActionListener action;
private JTextField tfUsername= null;
Employee employee;
CardTest cardTest;

public CardLogin(CardTest cardTest, Employee employee)
{
this.cardTest = cardTest;
this.employee = employee;
init();
}

private void init()
{
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();

gc.fill = GridBagConstraints.HORIZONTAL;

JLabel lbCardName = new JLabel("Login Card ");
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 2;
panel.add(lbCardName, gc);

JLabel lbUsername = new JLabel("Username: ");
gc.gridx = 0;
gc.gridy = 2;
gc.gridwidth = 1;
panel.add(lbUsername, gc);

tfUsername = new JTextField(20);
gc.gridx = 1;
gc.gridy = 2;
gc.gridwidth = 2;
panel.add(tfUsername, gc);

JLabel lbPassword = new JLabel("Password: ");
gc.gridx = 0;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(lbPassword, gc);

JPasswordField pfPassword = new JPasswordField(20);
gc.gridx = 1;
gc.gridy = 3;
gc.gridwidth = 2;
panel.add(pfPassword, gc);

final JButton loginButton = new JButton("Login");

action = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (tfUsername.getDocument().getLength() > 0)
{
employee.setUserName(tfUsername.getText());
cardTest.swapView(cardTest.CARD_DEPARTMENT);
}
}
};

loginButton.addActionListener(action);

JPanel bp = new JPanel();
bp.add(loginButton);

setSize( 640, 480);

add(panel, BorderLayout.CENTER);
add(bp, BorderLayout.PAGE_END);
}
}

class CardDepartment extends JPanel
{
private ActionListener actionNext;
private ActionListener actionLogout;
private JTextField tfDepartment= null;
private String department= null;
Employee employee;
CardTest cardTest;
CardLogin cardLogin;

public CardDepartment(CardTest cardTest, Employee employee)
{
this.employee = employee;
this.cardTest = cardTest;
init();
}

private void init()
{
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.HORIZONTAL;

JLabel lbCardName = new JLabel("Department Card ");
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 2;
panel.add(lbCardName, gc);

JLabel lbWelcome = new JLabel("Welcome ");
gc.gridx = 0;
gc.gridy = 2;
gc.gridwidth = 1;
panel.add(lbWelcome, gc);

gc.gridx = 1;
gc.gridy = 2;
gc.gridwidth = 2;
panel.add(new JLabel(employee.getUserName()), gc);

JLabel lbDepartment = new JLabel("Enter Department: ");
gc.gridx = 0;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(lbDepartment, gc);

tfDepartment = new JTextField(20);
gc.gridx = 1;
gc.gridy = 3;
gc.gridwidth = 2;
panel.add(tfDepartment, gc);

final JButton nextButton = new JButton("Next");
actionNext = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (tfDepartment.getDocument().getLength() > 0)
{
department = tfDepartment.getText();
cardTest.swapView(cardTest.CARD_TEAM);
}
}
};

final JButton logoutButton = new JButton("Logout");
actionLogout = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
cardTest.swapView(cardTest.CARD_LOGIN);
}
};

nextButton.addActionListener(actionNext);
logoutButton.addActionListener(actionLogout);

JPanel bp = new JPanel();
bp.add(panel);
bp.add(logoutButton);
bp.add(nextButton);

add(panel);
add(bp);
}
}

class CardTeam extends JPanel
{
private ActionListener actionPrev;
private ActionListener actionLogout;
private JTextField tfTeam= null;
Employee employee;
CardTest cardTest;

public CardTeam(CardTest cardTest, Employee employee)
{
this.cardTest = cardTest;
this.employee = employee;
init();
}

private void init()
{
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.HORIZONTAL;

JLabel lbCardName = new JLabel("Team Card ");
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 2;
panel.add(lbCardName, gc);

JLabel lbWelcome = new JLabel("Welcome ");
gc.gridx = 0;
gc.gridy = 2;
gc.gridwidth = 1;
panel.add(lbWelcome, gc);

gc.gridx = 1;
gc.gridy = 2;
gc.gridwidth = 2;
panel.add(new JLabel(employee.getUserName()), gc);

JLabel lbDepartment = new JLabel("Department: ");
gc.gridx = 0;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(lbDepartment, gc);

gc.gridx = 1;
gc.gridy = 3;
gc.gridwidth = 2;
panel.add(new JLabel(employee.getDepartment()), gc);

JLabel lbTeam = new JLabel("Enter Team: ");
gc.gridx = 0;
gc.gridy = 4;
gc.gridwidth = 1;
panel.add(lbTeam, gc);

tfTeam = new JTextField(20);
gc.gridx = 1;
gc.gridy = 4;
gc.gridwidth = 2;
panel.add(tfTeam, gc);

final JButton prevButton = new JButton("Prev");
actionPrev = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
cardTest.swapView(cardTest.CARD_DEPARTMENT);
}
};

final JButton logoutButton = new JButton("Logout");
actionLogout = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
cardTest.swapView(cardTest.CARD_LOGIN);
}
};

prevButton.addActionListener(actionPrev);
logoutButton.addActionListener(actionLogout);

JPanel bp = new JPanel();
bp.add(logoutButton);
bp.add(prevButton);

add(panel);
add(bp);
}
}

class Employee
{
private String userName = null;
private String department = null;
private String team = null;

public Employee() {
super();
}

public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getTeam() {
return team;
}
public void setTeam(String team) {
this.team = team;
}
}

最佳答案

您在代码中两次声明和初始化JPanel 卡片,一次作为实例变量,第二次在CardLayoutLoginTest 类的构造函数中。因为你的是一步一步的事情,所以你最好将你的 JPanel 添加到 CardLayout 中,一个一个地充当 Cards。因为如果 LoginFails 您将不需要它们,只需在登录有效时将您想要添加的内容添加到 CardLayout。

请使用 setLocationByPlatform(true);而不是 setLocationRelativeTo(null);。正如@Andrew Thompson 在他的一篇帖子中所解释的那样,前者更好,How to best position Swing GUI's我已经修改了您的代码,请查看并告诉我是否缺少某些内容。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardTest
{
private JFrame frame;
public static final String CARD_LOGIN = "Card Login";
public static final String CARD_WELCOME = "Card Welcome";
public static JPanel cards;
public CardLogin cardLogin = null;

public CardTest()
{
frame = new JFrame("Card LOGIN");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);

cards = new JPanel();
cards.setLayout(new CardLayout(20, 20));

cardLogin = new CardLogin(this);
cards.add(cardLogin, CARD_LOGIN);

frame.getContentPane().add(cards);
frame.pack();
frame.setVisible(true);
}

public void swapView(String key)
{
CardLayout cardLayout = (CardLayout) cards.getLayout();
cardLayout.show(cards, key);
}

public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CardTest();
}
});
}
}

class CardLogin extends JPanel
{
private ActionListener action;
CardTest cardLayoutLoginTest;
/*
* Made JTextField an instance variable so that
* ActionListener can access it or you can make
* it final.
*/
private JTextField tfUsername= null;
private String username = null;

public CardLogin(CardTest cardLayoutLoginTest)
{
this.cardLayoutLoginTest = cardLayoutLoginTest;
init();
}

private void init()
{

JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();

gc.fill = GridBagConstraints.HORIZONTAL;

JLabel lbUsername = new JLabel("Username: ");
gc.gridx = 0;
gc.gridy = 0;
gc.gridwidth = 1;
panel.add(lbUsername, gc);

tfUsername = new JTextField(20);
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 2;
panel.add(tfUsername, gc);

JLabel lbPassword = new JLabel("Password: ");
gc.gridx = 0;
gc.gridy = 1;
gc.gridwidth = 1;
panel.add(lbPassword, gc);

JPasswordField pfPassword = new JPasswordField(20);
gc.gridx = 1;
gc.gridy = 1;
gc.gridwidth = 2;
panel.add(pfPassword, gc);

final JButton loginButton = new JButton("Login");

action = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{

// Here need code to update text filed of welcome card
/*
* Here we are first checking if there is any text inside
* the JTextField for USERNAME, if found we will send it to the
* next JPanel which will be serving as a new Card.
*/
if (tfUsername.getDocument().getLength() > 0)
{
username = tfUsername.getText();
CardWelcome cardWelcome = new CardWelcome(cardLayoutLoginTest.cardLogin);
CardTest.cards.add(cardWelcome, cardLayoutLoginTest.CARD_WELCOME);
cardLayoutLoginTest.swapView(cardLayoutLoginTest.CARD_WELCOME);
}
}
};

loginButton.addActionListener(action);

JPanel bp = new JPanel();
bp.add(loginButton);

/*set size of the frame*/
setSize( 640, 480);

add(panel, BorderLayout.CENTER);
add(bp, BorderLayout.PAGE_END);

}

public String getUserName()
{
return username;
}
}

class CardWelcome extends JPanel
{
private JTextField textField;
private CardLogin cardLogin;

public CardWelcome(CardLogin cl)
{
cardLogin = cl;
init();
}

private void init()
{
setLayout(new GridLayout(1, 1));
JLabel userLabel = new JLabel("Welcome ");
textField = new JTextField();
textField.setText(cardLogin.getUserName());
System.out.println("UserName : " + cardLogin.getUserName());

add(userLabel);
add(textField);
}
}

在运行时更新 JLabel 的小示例程序:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class UpdateLabel extends JFrame
{
private int count = 0;
public UpdateLabel()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationByPlatform(true);

final JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());

final JLabel label = new JLabel("JLabel " + count);
JButton button = new JButton("UPDATE JLABEL");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
count++;
label.setText("JLabel " + count);
contentPane.revalidate(); // sometimes you require to do this and the below line.
contentPane.repaint();
}
});

contentPane.add(label, BorderLayout.CENTER);
contentPane.add(button, BorderLayout.PAGE_END);

setContentPane(contentPane);
pack();
setVisible(true);
}

public static void main(String... args)
{
Runnable runnable = new Runnable()
{
public void run()
{
new UpdateLabel();
}
};
SwingUtilities.invokeLater(runnable);
}
}

关于java - 如何在 CardLayout Swap 上将一张卡片的文本字段值显示到另一张卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com