如何在我的 Java 程序中使用 CardLayout 来实现登录和菜单项

2023-12-02

我正在创建一个“商店”程序,基本上可以允许员工使用我提供的用户名和密码登录。登录后,员工可以看到一个“主菜单”,其中有四个按钮:销售登记、PLU 设置、设置和注销。在此屏幕上,员工可以通过单击任何按钮导航到该屏幕。我不希望每次单击按钮时都会弹出一个新窗口,而是希望有一些转换(或没有转换)来转到单击的页面。

举个例子:当员工启动程序时,他/她会看到登录菜单。然后员工输入他/她的登录信息并点击登录。如果信息不正确,系统会提示员工重新输入信息。如果信息正确,员工现在将被发送到主菜单。在主菜单上,员工选择“销售登记册”,程序将转到销售登记册。所有这一切都应该在一个窗口中发生。

我已经添加了到目前为止我能够做的事情的代码。我已经创建了所有按钮和标签,但无法让它们显示在 JFrame 上并使用 CardLayout。另外,我不知道如何将登录代码与 CardLayout 链接起来。

感谢你们对我的帮助。这是代码:

主菜单代码(storeMainMenu.java)

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

public class storeMainMenu implements ActionListener {

    String loginString = "Login";
    String salesRegisterString = "Sales Register";
    String pluSettingsString = "PLU Settings";
    String settingsString = "Settings";
    String logoutString = "Logout";

    //JFrame
    int width = Toolkit.getDefaultToolkit().getScreenSize().width;
    int height = Toolkit.getDefaultToolkit().getScreenSize().height;
    Color myColor = Color.decode("#F1E0B8");

    //JPanel
    static JPanel buttonPanel = new JPanel();
    JPanel test1 = new JPanel();
    JPanel test2 = new JPanel();
    JPanel test3 = new JPanel();
    JPanel test4 = new JPanel();

    //Buttons
    JButton salesRegister = new JButton("Sales Register");
    JButton pluSettings = new JButton("PLU Settings");
    JButton settings = new JButton("Settings");
    JButton logout = new JButton("Logout");

    //Label
    JLabel header = new JLabel("Store Register");
    JLabel test_1 = new JLabel("Test 1");
    JLabel test_2 = new JLabel("Test 2");
    JLabel test_3 = new JLabel("Test 3");
    JLabel test_4 = new JLabel("Test 4");

    public storeMainMenu ()
    {
        //Header 
        header.setFont(new Font("Myriad", Font.PLAIN, 50));
        header.setBounds((width/6),0,1000,100);

        //Sales Register Bounds
        salesRegister.setBounds(100, 100, 500, 250);

        //PluSettings Bounds
        pluSettings.setBounds(700, 100, 500, 250);

        //Settings Bounds
        settings.setBounds(100, 500, 500, 250);

        //Logout Bounds
        logout.setBounds(700, 500, 500, 250);

        //JPanel bounds
        buttonPanel.setLayout(null);

        //TEST JPANEL
        test1.setLayout(null);
        test2.setLayout(null);
        test3.setLayout(null);
        test4.setLayout(null);

        test1.setSize(width, height);
        test2.setSize(width,height);
        test3.setSize(width, height);
        test4.setSize(width, height);

        //Test JPANEL Labels
        test_1.setFont(new Font("Myriad", Font.PLAIN, 50));
        test_1.setBounds((width/6),0,1000,100);
        test_2.setFont(new Font("Myriad", Font.PLAIN, 50));
        test_2.setBounds((width/6),0,1000,100);
        test_3.setFont(new Font("Myriad", Font.PLAIN, 50));
        test_3.setBounds((width/6),0,1000,100);
        test_4.setFont(new Font("Myriad", Font.PLAIN, 50));
        test_4.setBounds((width/6),0,1000,100);

        //Adding to test JPanel
        test1.add(test_1);
        test2.add(test_2);
        test3.add(test_3);
        test4.add(test_4);

        //Adding to JFrame
        buttonPanel.add(header);
        buttonPanel.add(salesRegister);
        buttonPanel.add(pluSettings);
        buttonPanel.add(settings);
        buttonPanel.add(logout);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        CardLayout cardLayout = new CardLayout();

        if (e.getSource() == salesRegister) {
            cardLayout.show(test1, salesRegisterString);
        }
        if (e.getSource() == pluSettings) {
            cardLayout.show(test2, pluSettingsString);
        }
        if (e.getSource() == settings) {
            cardLayout.show(test3, settingsString);
        }
        if (e.getSource() == logout) {
            cardLayout.show(test4, logoutString);
        }
    }


    static void createAndShowGUI() {
            int width = Toolkit.getDefaultToolkit().getScreenSize().width;
            int height = Toolkit.getDefaultToolkit().getScreenSize().height;
            Color myColor = Color.decode("#F1E0B8");

            JFrame frame = new JFrame("Store");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
            frame.setSize(width, height);
            frame.setBackground(myColor);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            frame.add(buttonPanel);
        }


    public static void main (String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }


}

登录代码(login.java):

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

@SuppressWarnings("serial")
public class login extends JFrame {

    //declaring our swing components
    JLabel l_name,l_pass;
    JTextField t_name;
    JPasswordField t_pass;     //A special JTextField but hides input text
    JButton button;
    Container c;
    boolean checkLogin = false;

    //a inner class to handling ActionEvents
    handler handle;

    //a separate class for processing database connection and authentication
    database db;    

    login()
    {
        super("Login form");

        c=getContentPane();
        c.setLayout(new FlowLayout());

        //extra classes
        db=new database();
            handle =new handler();

                //swing components
        l_name=new JLabel("Username");
        l_pass=new JLabel("Password");
        t_name=new JTextField(10);
        t_pass=new JPasswordField(10);
        button=new JButton("Login");

        //adding actionlistener to the button
        button.addActionListener(handle);

        //add to contaienr
        c.add(l_name);
        c.add(t_name);
        c.add(l_pass);
        c.add(t_pass);
        c.add(button);
        //visual
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200,175);

    }
    public static void main(String args[])
    {
        @SuppressWarnings("unused")
        login sample=new login();
    }
    //an inner class .You can also write as a separate class
    class handler implements ActionListener
    {
        //must implement method
        //This is triggered whenever the user clicks the login button
        public void actionPerformed(ActionEvent ae)
        {
            //checks if the button clicked
            if(ae.getSource()==button)
            {
                char[] temp_pwd=t_pass.getPassword();
                String pwd=null;
                pwd=String.copyValueOf(temp_pwd);
                System.out.println("Username,Pwd:"+t_name.getText()+","+pwd);

                //The entered username and password are sent via "checkLogin()" which return boolean
                if(db.checkLogin(t_name.getText(), pwd))
                {
                    //a pop-up box
                    JOptionPane.showMessageDialog(null, "You have logged in successfully","Success",
                                        JOptionPane.INFORMATION_MESSAGE);
                    checkLogin = true;
                }
                else
                {
                    //a pop-up box
                    JOptionPane.showMessageDialog(null, "Login failed!","Failed!!",
                                        JOptionPane.ERROR_MESSAGE);
                    checkLogin = false;
                }
            }//if
        }//method

    }//inner class

}

数据库代码(登录代码引用此代码以获取 MySQL 信息)(database.java)

import java.sql.*;
public class database 
{
    Connection con;
    PreparedStatement pst;
    ResultSet rs;
    database()
    {
        try{

            //MAKE SURE YOU KEEP THE mysql_connector.jar file in java/lib folder
            //ALSO SET THE CLASSPATH
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost:3306/SchoolStoreUsers","root","schoolstore");
                        pst=con.prepareStatement("select * from users where uname=? and pwd=?");

           }
        catch (Exception e) 
        {
            System.out.println(e);
        }
    }
        //ip:username,password
        //return boolean
    public Boolean checkLogin(String uname,String pwd)
    {
        try {

            pst.setString(1, uname); //this replaces the 1st  "?" in the query for username
            pst.setString(2, pwd);    //this replaces the 2st  "?" in the query for password
            //executes the prepared statement
            rs=pst.executeQuery();
            if(rs.next())
            {
                //TRUE iff the query founds any corresponding data
                return true;
            }
            else
            {
                return false;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("error while validating"+e);
            return false;
        }
    }
}                                                                               

  1. 停止使用null布局,说真的,这是比 Swing 的其他任何问题更多问题的根源
  2. 当使用添加组件到面板时CardLayout,每个面板必须有一个名称
  3. In your actionPerformed方法,这不是方法CardLayout作品。首先,您要创建一个新实例CardLayout,其中不包含任何组件,那么您如何期望它能够突然弄清楚要切换到什么?使用时CardLayout#show,组件引用是由 管理的父组件CardLayout

更新了示例

enter image description here

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MyCardLayout {

    public static void main(String[] args) {
        new MyCardLayout();
    }

    public MyCardLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JPanel mainPane;
        private JPanel navPane;
        private List<String> pages;
        private int currentPage;

        public TestPane() {
            pages = new ArrayList<>(25);
            setLayout(new BorderLayout());

            mainPane = new JPanel(new CardLayout());
            navPane = new JPanel();

            for (int index = 0; index < 10; index++) {
                addPageTo(mainPane, "Page" + index, new JLabel("Page " + index, JLabel.CENTER));
            }

            JButton btnPrev = new JButton("<<");
            JButton btnNext = new JButton(">>");

            navPane.add(btnPrev);
            navPane.add(btnNext);

            btnPrev.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setCurrentPage(getCurrentPage() - 1);
                }
            });
            btnNext.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setCurrentPage(getCurrentPage() + 1);
                }
            });

            add(mainPane);
            add(navPane, BorderLayout.SOUTH);

            setCurrentPage(0);
        }

        public int getCurrentPage() {
            return currentPage;
        }

        protected void setCurrentPage(int page) {
            if (pages.size() > 0) {
                if (page < 0) {
                    page = pages.size() - 1;
                } else if (page >= pages.size()) {
                    page = 0;
                }

                currentPage = page;
                CardLayout layout = (CardLayout)mainPane.getLayout();
                layout.show(mainPane, pages.get(currentPage));
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void addPageTo(JPanel pane, String name, Component comp) {
            pages.add(name);
            pane.add(comp, name);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在我的 Java 程序中使用 CardLayout 来实现登录和菜单项 的相关文章

随机推荐

  • 是否可以在 XP 上运行 .NET 4.5 应用程序?

    首先 我已阅读以下内容 连接案例 VS case 尤其是这个频道9帖子 因此 从最后一个要点来看 我确实认为没有办法解决这个问题 但我必须看看是否可以获得明确的答案 因为我的团队希望从 NET 4 0 升级到 NET 4 5 不过 我们必须
  • 动态字典名称解码器 json

    Swift 4 我的情况与在动态类型 对象上使用 Codable但对我来说 变化的变量是字典的名称 而不是里面的键 看起来像 customName constantKey Double constantKey2 Double 这是我试图更改
  • Raspberry Pi 4 I2C 总线无法正常工作

    尽管 i2cDetect 确实检测到目标 但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作 我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C
  • 如何知道Databricks支持的文件格式?

    我需要将各种文件 不同类型 加载到 Spark 数据框中 Databricks 支持所有这些文件格式吗 如果是 我在哪里可以获得每种文件格式支持的选项列表 delimited csv parquet avro excel json Than
  • 如何在一行中计算数据框中的并发事件?

    我有一个包含电话的数据集 我想计算每条记录有多少个活动呼叫 我找到了这个question但我想避免循环和函数 每个调用都有一个date a start time and a end time 数据框 start end date 0 09
  • 如何更新 OptionMenu 的命令

    我正在尝试在实例化后设置或更新 OptionMenu 的命令 The widget configure command foo 声明适用于Button and CheckButton 但不适合OptionMenu 以下代码引发此错误 tki
  • 为什么我无法关闭或消除 UIWebView 中的 Javascript 警报?

    情况 我调用 Javascriptalert通过UIWebView method stringByEvaluatingJavaScriptFromString 像这样 myWebView stringByEvaluatingJavaScri
  • 在 Django 中自动填充一组通用的多对多字段?

    我正在尝试结合this答案和这个one 带有一点 for 循环 在创建角色时 我想添加所有可能的技能 其值为 0 但我对如何遵循上述答案感到困惑 我有这个混合 class CrossCharacterMixin models Model c
  • PHP 多维数组 - 删除重复项

    如果有人能在这里帮助我 我将永远感激不已 因为我已经花了大约 2 天的时间试图让它发挥作用 我想获取两个多维数组并比较它们 然后remove任何重复的记录 场景是 array2 中的值已分配给用户的配置文件 array1 中的值是用户可以选
  • Python:将文本文件转换为二进制文件

    我们可以将任何数字文件转换为二进制文件 我有一个1MB的文本文件 我想将其转换为二进制字符串并将输出视为二进制数 反之亦然 换句话说 如果我有二进制数 我想将其转换为文本文件 我怎样才能在Python中做到这一点 有没有标准的方法来做到这一
  • 从 Arduino UNO R3 套件读取数据

    我正在尝试读取我已经存储在的数据Arduino套件 我正在使用物理类库为了达成这个 我通过使用以下命令将套件连接到我的电脑来测试该套件 读取数据 B 型 USB 电缆由Arduino本身提供并使用泰拉术语 在我按键盘上的 后数据开始传输 特
  • Python - 确定参数是否为整数

    我对 Python 比较陌生 我想提出一个基本程序 可以确定参数在函数中是否有整数 我不知道该在空白处填什么 我通常不使用 if in 类型配对 该函数的基础是这样的 def is number char if somethinghere
  • 使用 Python 发送 HTML 电子邮件

    如何使用Python发送电子邮件中的HTML内容 我可以发送简单的短信 From Python v2 7 14 文档 18 1 11 电子邮件 示例 以下是如何使用替代纯文本版本创建 HTML 消息的示例 usr bin python im
  • Playstore 会拒绝使用 armeabi-v7a、arm64-v8a、x86 但不支持 x86-64 的应用吗?

    来自 Android 开发者网站 https developer android com distribute best practices develop 64 bit很明显 从 2019 年 8 月 1 日开始 Google Play
  • WordPress print_thumbnail 没有给出正确的 url

    我一直很难解决这个问题 我在 Ubuntu Server 64 位上运行 Wordpress 3 3 1 因此 我可以上传图像并使用提供的网址查看它 但是 当我将其设置为特征图像时 该功能似乎 print thumbnail 没有给我正确的
  • C 中的# 和## 宏[重复]

    这个问题在这里已经有答案了 方案一 include
  • 在本地主机上运行 Node JS 服务器

    例如 我想制作一个像这样的非常简单的网络服务器 const http require http http createServer function req res res writeHead 200 Content Type text p
  • Java class.getResourceAsStream() 返回错误的字节

    我刚刚遇到了 getResourceAsStream 的一个非常奇怪的问题 在我的产品项目 JUnit 测试中 我使用 getResourceAsStream 读取测试数据 我发现 getResourceAsStream 有时会替换一些字节
  • gwt-maven-plugin:编译失败“状态 1”

    我已经在 GWT 项目上工作了一段时间 并且我相信自从添加了新的依赖项后 我收到了以下错误 无法在项目项目上执行目标 org codehaus mojo gwt maven plugin 2 6 1 compile 默认 命令 bin sh
  • 如何在我的 Java 程序中使用 CardLayout 来实现登录和菜单项

    我正在创建一个 商店 程序 基本上可以允许员工使用我提供的用户名和密码登录 登录后 员工可以看到一个 主菜单 其中有四个按钮 销售登记 PLU 设置 设置和注销 在此屏幕上 员工可以通过单击任何按钮导航到该屏幕 我不希望每次单击按钮时都会弹