検索
ホームページJava&#&チュートリアルJavaでログインウィンドウを実装する方法

ログインウィンドウメインクラス

package ccnu.paint;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import ccnu.util.Answer;
import ccnu.util.Verification;

public class Login extends JFrame
{
    private static final long serialVersionUID = 1L;

    private Properties pro = new Properties();

    private boolean ver_code = false; // 默认输入验证码错误

    private Answer answer = null;

    private JPanel p1 = new JPanel(); // 添加到JPanel中的组件默认为流式布局
    private JLabel luser = new JLabel("username: ");
    private JTextField username = new JTextField(20);

    private JPanel p2 = new JPanel();
    private JLabel lpwd = new JLabel("password: ");
    private JPasswordField pwd = new JPasswordField(20);

    private JPanel p4 = new JPanel();
    private JLabel lVer = new JLabel("verification: ");
    private JTextField ver = new JTextField(10);
    private JLabel img = new JLabel();
    private JLabel result = new JLabel();

    private JPanel p3 = new JPanel();
    private JButton ok = new JButton("ok");
    private JButton cancel = new JButton("cancel");
    private JButton signUp = new JButton("Sign up"); // 用于账户注册

    // 设置组件的监听
    public void initListener()
    {
        username.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {// JTextField的action是回车键
                String name = username.getText();
                // Login.this.setTitle(name);
                // System.out.println(name.hashCode() + "***" +"".hashCode());
                if (name.equals(""))
                {
                    JOptionPane.showMessageDialog(Login.this, "Please input a userName!");
                } else
                {
                    pwd.grabFocus();
                }
            }
        });

        pwd.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e)
            {
                String password = new String(pwd.getPassword());
                if(password.equalsIgnoreCase(""))
                {
                    JOptionPane.showMessageDialog(Login.this, "please input a password!");
                }else{
                    ver.grabFocus();
                }
            }

        });

        ok.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e)
            {
                // 重新加载最新的账户文件
                try
                {
                    pro.load(new FileInputStream(new File("src/res/accouts.properties")));
                } catch (IOException e1)
                {
                    e1.printStackTrace();
                }
                check();
            }

        });

        // 判断验证码是否正确
        ver.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e)
            {
                String verCode = ver.getText();
                if(verCode.equals(""))
                {
                    JOptionPane.showMessageDialog(Login.this, "Please input a verification!");
                }else{
                    if(verCode.equals(answer.getResult()))
                    {
                        result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/right.jpg"))); // 显示提示的图片信息(如√图片)
                        ver_code = true;
                        // 检查之前,重新加载最新的账户文件
                        try
                        {
                            pro.load(new FileInputStream(new File("src/res/accouts.properties"))); // 将账户文件加载进来
                        } catch (IOException e1)
                        {
                            e1.printStackTrace();
                        }
                        check();
                    }else{
                        result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/error.jpg"))); // 显示提示的图片信息(如×图片) 
                        ver_code = false;
                    }
                }
            }
        });

        // 点击图片会更改验证码
        img.addMouseListener(new MouseAdapter(){

            @Override
            public void mouseClicked(MouseEvent e)
            {
                answer = Verification.verification();
                img.setIcon(new ImageIcon(answer.getBufferedImage())); // 设置验证码图案
            }
        });

        cancel.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int option = JOptionPane.showConfirmDialog(Login.this, "Are you sure to exit?");
//              System.out.println("option = " + option);
                if (option == 0)
                {// Yes
                    Login.this.dispose();
                }
            }
        });

        signUp.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e)
            {
                new SignUp();
            }
        });
    }

    // 初始化登录窗口及其组件的设置监听
    public Login()
    {
        super("Login");

        // 加载账户文件
        try
        {
            pro.load(new FileInputStream(new File("src/res/accouts.properties"))); // 从指定位置将账户文件加载进来
        } catch (IOException e)
        {
            e.printStackTrace();
        }

        initListener();
        answer = Verification.verification(); // 生成验证码
        img.setIcon(new ImageIcon(answer.getBufferedImage())); // 设置初始验证码

        this.setLocation(new Point(200, 200));
        this.setSize(500, 300);
        this.setLayout(new GridLayout(4, 1, 0, 20)); // 垂直间隙为20px
        p1.add(luser);
        p1.add(username);
        p2.add(lpwd);
        p2.add(pwd);
        p4.add(this.lVer);
        p4.add(this.ver);
        p4.add(this.img);
        result.setForeground(Color.red);
        result.setFont(new Font("楷体", Font.BOLD, 20));
        p4.add(result);
        p3.add(ok);
        p3.add(cancel);
        p3.add(signUp);
        this.add(p1);
        this.add(p2);
            this.add(p4);
        this.add(p3);

//      this.setBackground(Color.blue); // JFrame的上层还有一个ContentPane
        this.getContentPane().setBackground(Color.gray);
        this.setResizable(false);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 等价于Frame中的windowClosing事件
    }

    // 检查用户名或密码
    public void check()
    {

        String verCode = ver.getText();
        if(verCode.equals(""))
        {
            JOptionPane.showMessageDialog(Login.this, "Please input a verification!");
            return;
        }else{
            if(verCode.equals(answer.getResult()))
            {
                result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/right.jpg")));
                ver_code = true;
            }else{
                result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/error.jpg")));
                ver_code = false;
            }
        }

        if(ver_code == false)
        {
            JOptionPane.showMessageDialog(this, "verification is error!");
            return;
        }
        String name = username.getText();
        String password = new String(pwd.getPassword()); // return char[]
//      if (name.equalsIgnoreCase("admin") && password.equals("123456"))
        if (isPass(name, password))
        {
//          new PaintApp(name);
            JOptionPane.showMessageDialog(this, "-^_^-   OK..."); // 此处可以加上其他的登陆成功后进一步处理的窗口
            this.dispose();
        } else
        {
            JOptionPane.showMessageDialog(this, "userName or password is incorrect!");
            username.setText("");
            pwd.setText("");
            ver.setText("");
            answer = Verification.verification();
            img.setIcon(new ImageIcon(answer.getBufferedImage()));
            result.setIcon(null);
        }
    }

    // 验证用户输入的账户名和密码是否正确(通过与加载进来的账户 pro 比对)
    public boolean isPass(String name, String password)
    {
        Enumeration en = pro.propertyNames();
        while(en.hasMoreElements())
        {
            String curName = (String)en.nextElement();
//          System.out.println(curName + "---" + pro.getProperty(curName));
            if(curName.equalsIgnoreCase(name))
            {
                if(password.equalsIgnoreCase(pro.getProperty(curName)))
                {
                    return true;
                }
            }
        }
        return false;
    }

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

アカウント登録クラス

package ccnu.paint;

import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class SignUp extends JFrame
{
    private static final long serialVersionUID = 3054293481122038909L;

    private Properties pro = new Properties(); // 最好时静态的,因为账户是共享的

    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("username: ");
    private JTextField field = new JTextField(15);

    private JPanel panel2 = new JPanel();
    private JLabel label2 = new JLabel("password: ");
    private JPasswordField field2 = new JPasswordField(15);

    private JPanel panel3 = new JPanel();
    private JLabel label3 = new JLabel("confirmation: ");
    private JPasswordField field3 = new JPasswordField(15);

    private JPanel panel4 = new JPanel();
    private JButton button = new JButton("OK");
    private JButton button2 = new JButton("Cancel");

    public void initListener()
    {
        field.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                field2.grabFocus();
            }

        });

        field2.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                field3.grabFocus();
            }
        });
        field3.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                ok_actionPerformed(e);
            }

        });

        // OK
        button.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                ok_actionPerformed(e);
            }
        });

        // Cancel
        button2.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                cancel_actionPerformed(e);
            }
        });
    }

    public void ok_actionPerformed(ActionEvent e)
    {
        String userName = field.getText();
        String password = new String(field2.getPassword());
        String password2 = new String(field3.getPassword());
        if (userName.equals(""))
        {
            JOptionPane.showMessageDialog(SignUp.this, "username cannot be empty!");
        } else
        {
            if (password.equalsIgnoreCase(""))
            {
                JOptionPane.showMessageDialog(SignUp.this, "password cannot be empty!");
            } else
            {
                if (password2.equalsIgnoreCase(password))
                {
                    if (isExist(userName))
                    {
                        JOptionPane.showMessageDialog(SignUp.this, "username has been existed!");
                        field.setText("");
                        field2.setText("");
                        field3.setText("");
                    } else
                    {
                        pro.setProperty(userName, password);
                        JOptionPane.showMessageDialog(SignUp.this, "SignUp success!");
                        writeToPro(userName, password); // 将其写入到账户文件中
                        SignUp.this.dispose();
                    }
                } else
                {
                    JOptionPane.showMessageDialog(SignUp.this, "password is not consistent!");
                    field2.setText("");
                    field3.setText("");
                }
            }
        }
    }

    public void cancel_actionPerformed(ActionEvent e)
    {
        System.exit(0);
    }

    public SignUp()
    {
        super("Sign up");

        // 加载账户文件
        try
        {
            pro.load(new FileInputStream(new File("src/res/accouts.properties")));
        } catch (IOException e)
        {
            e.printStackTrace();
        }

        // 初始化窗口组件的监听
        initListener();

        this.setLocation(new Point(300, 230));
        this.setSize(280, 210);

        this.setLayout(new GridLayout(4, 1, 0, 20)); // 垂直间隙为20px
        panel.add(label);
        panel.add(field);
        panel2.add(label2);
        panel2.add(field2);
        panel3.add(label3);
        panel3.add(field3);
        panel4.add(button);
        panel4.add(button2);
        this.add(panel);
        this.add(panel2);
        this.add(panel3);
        this.add(panel4);

        this.setAlwaysOnTop(true);
        this.setResizable(false);
        this.setVisible(true);
    }

    // 如果注册始终可用,就要保存起来,否则不需要写入文件中,注册账户本次使用
    // 将账户名与其对应密码保存到指定的账户文件中
    public void writeToPro(String userName, String password)
    {
        pro.setProperty(userName, password);
        try
        {
            pro.store(new FileOutputStream(new File("src/res/accouts.properties")), "allAccouts");
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }


    // 判断此用户名是否已经存在
    public boolean isExist(String userName)
    {
        Enumeration enumer = pro.propertyNames();
        while (enumer.hasMoreElements())
        {
            String temp = (String) enumer.nextElement();
            if (temp.equals(userName))
            {
                return true;
            }
        }
        return false;
    }
}

検証コード生成クラス

package ccnu.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.Random;

// 用于生成验证码
public class Verification
{
    private static Answer answer = new Answer();
    private static BufferedImage bufferedImage = null;
    private static String result = null;
    private static String words = null;
    private static String words2 = null;

    // 生成验证码
    public static Answer verification()
    {

        bufferedImage = new BufferedImage(200, 35, BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.getGraphics();
        Random rand = new Random();
        for (int i = 0; i < 20; i++)
        {
            Point p1 = new Point(rand.nextInt(200), rand.nextInt(30));
            Point p2 = new Point(rand.nextInt(200), rand.nextInt(30));
            g.drawLine(p1.x, p1.y, p2.x, p2.y);
        }
        g.setColor(Color.RED);
        g.setFont(new Font("楷体", Font.BOLD, 22));
        int plan = 2;
        switch (rand.nextInt(plan))
        {
        case 0:
            plan(g);
            break;
        case 1:
            plan1(g);
            break;
        default:
            break;
        }
        answer.setBufferedImage(bufferedImage);
        answer.setResult(result);
        g.dispose();
        return answer;
    }

    // 方案一
    private static void plan(Graphics g)
    {
        words = ReadTxt.read("/res/words.txt"); // 指定生成验证码问题的资源文件的路径
        Random rand = new Random();
        String first = String.valueOf(words.charAt(rand.nextInt(words.length())));
        String second = String.valueOf(words.charAt(rand.nextInt(words.length())));
        String third = String.valueOf(words.charAt(rand.nextInt(words.length())));
        g.drawString(first, rand.nextInt(40) + 20, rand.nextInt(12) + 15);
        g.drawString(second, rand.nextInt(40) + 80, rand.nextInt(12) + 15);
        g.drawString(third, rand.nextInt(40) + 140, rand.nextInt(12) + 15);
        result = first + second + third;
    }

    // 方案二
    private static void plan1(Graphics g)
    {
        words2 = ReadTxt.read("/res/words2.txt"); // 指定生成验证码问题的资源文件的路径
        Random rand = new Random();
        String first = String.valueOf(words2.charAt(rand.nextInt(words2.length() - 2)));
        String second = String.valueOf(words2.charAt(rand.nextInt(2) + 9));
        String third = String.valueOf(words2.charAt(rand.nextInt(words2.length() - 2)));
        g.drawString(first, rand.nextInt(30) + 20, rand.nextInt(12) + 15);
        g.drawString(second, rand.nextInt(40) + 60, rand.nextInt(12) + 15);
        g.drawString(third, rand.nextInt(30) + 110, rand.nextInt(12) + 15);
        g.drawString("=", rand.nextInt(40) + 150, rand.nextInt(12) + 15);
        if(second.equals("+"))
        {
            result = String.valueOf(Integer.valueOf(first) + Integer.valueOf(third)); 
        }else{
            result = String.valueOf(Integer.valueOf(first) - Integer.valueOf(third)); 
        }
    }

}

検証コードの生成に必要なファイルクラスの読み取り

package ccnu.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 专门用于读取文件
public class ReadTxt
{
    public static String read(String path) // 根据指定路径path来读取它,并返回它所包含的内容
    {
        StringBuffer sb = new StringBuffer();
        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(Verification.class.getResourceAsStream(path)));
            String temp = null;
            while(null != (temp = br.readLine()))
            {
                sb.append(temp);
            }
            br.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        return sb.toString();
    }

}

生成された検証コードに含まれる情報クラスの取得(パターン、質問)

package ccnu.util;

import java.awt.image.BufferedImage;

// 用于将生成的验证码的图案信息以及问题结果封装
public class Answer
{
    private BufferedImage bufferedImage = null; // 验证码图像
    private String result = null; // 验证码图像问题的答案

    public BufferedImage getBufferedImage()
    {
        return bufferedImage;
    }
    public void setBufferedImage(BufferedImage bufferedImage)
    {
        this.bufferedImage = bufferedImage;
    }
    public String getResult()
    {
        return result;
    }
    public void setResult(String result)
    {
        this.result = result;
    }

}

検証コード生成ファイルwords.txt
例: 中国湖北省武漢市、漢東大学政治法学部

検証コード生成ファイルwords2.txt
123456789 -

プロンプト画像

Javaでログインウィンドウを実装する方法

Javaでログインウィンドウを実装する方法

##ログイン効果

Javaでログインウィンドウを実装する方法

以上がJavaでログインウィンドウを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール