在JFrame中实现CardLayout并根据特定的按钮按下来切换卡

我已经在下面发布了我的代码。我有创建可导航GUI的简单任务。我花了过去的几个小时研究如何实现此目标,这是我编写的代码。

本来我想在没有任何布局或任何内容的情况下执行导航。用户单击欢迎面板上的“登录”按钮后,我需要显示主页面板。

它可以很好地显示欢迎卡,但是当我进入validateLogin方法(按下登录按钮时将被激活,并且成功登录后,它应显示卡中的主面板),即使我仍然停留在欢迎面板上已经验证我的程序已到达循环以通过system.out.Println()更换卡

请帮忙。我花了整个星期六试图通过试验和研究解决这一问题,但没有成功。这对我来说是不得已的办法,因此,如果有人可以向我展示我的缺点,那么我会很乐意继续前进并进行修复。然后将该修复程序应用于我的程序所需的许多其他卡。

    enter code here

public class mainGUI implements ActionListener{

JFrame main;

JPanel cards = new JPanel(new CardLayout());

CardLayout cl = (CardLayout)(cards.getLayout());

//Items for the welcome panel

JPanel welcome = welcomePanel();

JButton login;

JButton register;

JTextField username;

JTextField password;

//home panel

JPanel home = homePanel();

//WelcomePanel welcome = new WelcomePanel();

ArrayList<Student> students = new ArrayList<Student>();

Student workingStudent;

/**

* calls load() at start and save() on exit

*

*/

public mainGUI(){

load();

main = new JFrame();

main.setSize(900, 600);

main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

main.setTitle("MyCourses 2k16");

main.setContentPane(welcomePanel());

//fill out the cards

cards.add(welcome, "Welcome");

cards.add(home, "Home");

//display welcome card

cl.show(cards, "welcome");

main.setVisible(true);

saveState();

}

private JPanel welcomePanel() {

JPanel welcome = new JPanel();

welcome.setLayout(null);

welcome.setBackground(Color.DARK_GRAY);

JLabel hi = new JLabel("Welcome to MyCourses 2K16");

hi.setSize(800, 100);

hi.setLocation(50,50);

hi.setFont(new Font("Serif", Font.BOLD, 48));

hi.setForeground(Color.WHITE);

JLabel select = new JLabel("Fill in the information, then click login or register to proceed, no special characters allowed");

select.setSize(700,100);

select.setLocation(75,100);

select.setFont(new Font("Serif", Font.PLAIN, 18));

select.setForeground(Color.WHITE);

login = new JButton( "login");

login.setSize(100, 50);

login.setLocation(50, 200);

login.addActionListener(this);

register = new JButton( "register");

register.setSize(100,50);

register.setLocation(200, 200);

register.addActionListener(this);

JLabel un = new JLabel("username");

un.setSize(100, 30);

un.setLocation(50, 270);

un.setForeground(Color.WHITE);

username = new JTextField();

username.setSize(200, 30);

username.setLocation(50,300);

JLabel pw = new JLabel("password");

pw.setSize(100, 30);

pw.setLocation(50, 350);

pw.setForeground(Color.WHITE);

password = new JTextField();

password.setSize(200, 30);

password.setLocation(50,380);

welcome.add(hi);

welcome.add(select);

welcome.add(login);

welcome.add(register);

welcome.add(un);

welcome.add(username);

welcome.add(pw);

welcome.add(password);

return welcome;

}

private JPanel homePanel() {

JPanel home = new JPanel();

home.setLayout(null);

home.setBackground(Color.DARK_GRAY);

JLabel hi = new JLabel("HOME");

hi.setSize(800, 100);

hi.setLocation(50,50);

hi.setFont(new Font("Serif", Font.BOLD, 48));

hi.setForeground(Color.WHITE);

return home;

}

public void load(){

}

private void saveState(){

Iterator<Student> it = students.iterator();

while(it.hasNext()){

it.next().saveStudent();

}

}

public static void main(String[] args) {

new mainGUI();

}

@Override

public void actionPerformed(ActionEvent e) {

if (e.getSource()==login){

System.out.println("Logging in...");

validateLogin(students);

}

else if (e.getSource()==register){

}

}

private void validateLogin(ArrayList<Student> students){

boolean valid = false;

for(int i = 0; i < students.size(); i++){

if(username.getText().equals(students.get(i).getUsername())

&& password.getText().equals(students.get(i).getPassword()))

{

valid = true;

workingStudent=(students.get(i));

System.out.println("Successful Login!");

cl.show(cards, "home");

}

}

if(valid == false){

System.out.println("Invalid Login, try again");

}

}

}

回答:

您创建了一个使用CardLayout和卡片的JPanel,但是没有添加任何内容,因此它当然不会显示自身,也不会显示卡片。解决方案:将此JPanel添加到您的GUI。

所以代替:

main.setContentPane(welcomePanel());

做:

main.setContentPane(cards);


问题编号2:

将字符串用作键的类型时,请使用字符串常量。请注意,您因此将一个JPanel添加到卡JPanel中:

cards.add(home, "Home");

但是,然后尝试像这样显示它:

cl.show(cards, "home");

但是“家”与“家”不同。

而是声明一个常量HOME:

public static final String HOME = "home";

并使用相同的常量添加并显示JPanel。

举一个简单的例子:

import java.awt.CardLayout;

import java.awt.event.ActionEvent;

import javax.swing.*;

public class MainGui2 extends JPanel {

private CardLayout cardLayout = new CardLayout();

private WelcomePanel welcomePanel = new WelcomePanel(this);

private HomePanel homePanel = new HomePanel();

public MainGui2() {

setLayout(cardLayout);

add(welcomePanel, WelcomePanel.NAME);

add(homePanel, HomePanel.NAME);

}

public void showCard(String name) {

cardLayout.show(this, name);

}

private static void createAndShowGui() {

MainGui2 mainPanel = new MainGui2();

JFrame frame = new JFrame("MainGui2");

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

frame.getContentPane().add(mainPanel);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGui();

}

});

}

}

class WelcomePanel extends JPanel {

public static final String NAME = "welcome panel";

private MainGui2 mainGui2;

public WelcomePanel(final MainGui2 mainGui2) {

this.mainGui2 = mainGui2;

add(new JLabel(NAME));

add(new JButton(new AbstractAction("Logon") {

@Override

public void actionPerformed(ActionEvent e) {

mainGui2.showCard(HomePanel.NAME);

}

}));

}

}

class HomePanel extends JPanel {

public static final String NAME = "home panel";

public HomePanel() {

add(new JLabel(NAME));

}

}

以上是 在JFrame中实现CardLayout并根据特定的按钮按下来切换卡 的全部内容, 来源链接: utcz.com/qa/409629.html

回到顶部