Login window main class
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(); } }
Account registration class
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; } }
Generate verification code class
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)); } } }
Read the file class required to generate the verification code
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(); } }
Get the information class contained in the generated verification code(Pattern, question)
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; } }
Verification code generation file words.txt
For example: Handong University School of Political Science and Law, Wuhan City, Hubei Province, China
Verification code generation file words2.txt
123456789 -
Prompt picture
The above is the detailed content of How to implement login window in java. For more information, please follow other related articles on the PHP Chinese website!

Java is widely used in enterprise-level applications because of its platform independence. 1) Platform independence is implemented through Java virtual machine (JVM), so that the code can run on any platform that supports Java. 2) It simplifies cross-platform deployment and development processes, providing greater flexibility and scalability. 3) However, it is necessary to pay attention to performance differences and third-party library compatibility and adopt best practices such as using pure Java code and cross-platform testing.

JavaplaysasignificantroleinIoTduetoitsplatformindependence.1)Itallowscodetobewrittenonceandrunonvariousdevices.2)Java'secosystemprovidesusefullibrariesforIoT.3)ItssecurityfeaturesenhanceIoTsystemsafety.However,developersmustaddressmemoryandstartuptim

ThesolutiontohandlefilepathsacrossWindowsandLinuxinJavaistousePaths.get()fromthejava.nio.filepackage.1)UsePaths.get()withSystem.getProperty("user.dir")andtherelativepathtoconstructthefilepath.2)ConverttheresultingPathobjecttoaFileobjectifne

Java'splatformindependenceissignificantbecauseitallowsdeveloperstowritecodeonceandrunitonanyplatformwithaJVM.This"writeonce,runanywhere"(WORA)approachoffers:1)Cross-platformcompatibility,enablingdeploymentacrossdifferentOSwithoutissues;2)Re

Java is suitable for developing cross-server web applications. 1) Java's "write once, run everywhere" philosophy makes its code run on any platform that supports JVM. 2) Java has a rich ecosystem, including tools such as Spring and Hibernate, to simplify the development process. 3) Java performs excellently in performance and security, providing efficient memory management and strong security guarantees.

JVM implements the WORA features of Java through bytecode interpretation, platform-independent APIs and dynamic class loading: 1. Bytecode is interpreted as machine code to ensure cross-platform operation; 2. Standard API abstract operating system differences; 3. Classes are loaded dynamically at runtime to ensure consistency.

The latest version of Java effectively solves platform-specific problems through JVM optimization, standard library improvements and third-party library support. 1) JVM optimization, such as Java11's ZGC improves garbage collection performance. 2) Standard library improvements, such as Java9's module system reducing platform-related problems. 3) Third-party libraries provide platform-optimized versions, such as OpenCV.

The JVM's bytecode verification process includes four key steps: 1) Check whether the class file format complies with the specifications, 2) Verify the validity and correctness of the bytecode instructions, 3) Perform data flow analysis to ensure type safety, and 4) Balancing the thoroughness and performance of verification. Through these steps, the JVM ensures that only secure, correct bytecode is executed, thereby protecting the integrity and security of the program.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

WebStorm Mac version
Useful JavaScript development tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Zend Studio 13.0.1
Powerful PHP integrated development environment

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function
