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에서 로그인 창을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4
