l_user=new JLabel("用户名:",JLabel.RIGHT); l_pwd=new JLabel(" 密码:",JLabel.RIGHT); t_user=new JTextField(31);
时间: 2024-04-03 19:31:04 浏览: 13
这段代码是用Java Swing库创建一个登录界面的用户名和密码输入框。其中,JLabel是一个标签组件,用于显示文本或者图像。JTextField是一个文本输入组件,用于接收用户输入的文本信息。这里的l_user和l_pwd是用于显示“用户名”和“密码”这两个文本的标签组件,t_user是用于接收用户输入的用户名的文本输入组件。其中,JLabel.RIGHT表示标签上的文本右对齐。JTextField(31)中的31表示文本输入框的长度,即可以输入31个字符的长度。
相关问题
package text6; import text6.inquire; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class inquire1 extends JFrame implements ActionListener{ JLabel lbl_name=new JLabel("用户名"); JLabel lbl_pwd=new JLabel("密码"); JTextField txt_name=new JTextField(); JPasswordField txt_pwd=new JPasswordField(); JButton btn_ok=new JButton("登录"); JButton btn_cancel=new JButton("取消"); inquire dao=new inquire(); public inquire1() { setLayout(new GridLayout(3,2)); add(lbl_name); add(txt_name); add(lbl_pwd); add(txt_pwd); add(btn_ok); add(btn_cancel); btn_ok.addActionListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) { JFrame.setDefaultLookAndFeelDecorated(true); inquire1 frm=new inquire1(); frm.setSize(200,200); frm.setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource()==btn_ok) { String uname=txt_name.getText().trim(); String upwd=txt_pwd.getText().trim(); boolean flag=dao.validate(uname, upwd); if(flag) { JOptionPane.showMessageDialog(this,"用户验证通过"); }else { JOptionPane.showConfirmDialog(this,"用户名或密码输入错误"); } } } }改错
该代码没有语法错误,但是可以进行一些改进:
1. 在验证失败时,应该使用 JOptionPane.showMessageDialog() 方法显示错误信息,而不是使用 JOptionPane.showConfirmDialog() 方法,因为 showConfirmDialog() 方法会返回用户点击的按钮,而 showMessageDialog() 方法只是显示信息。
2. 在验证成功时,应该直接关闭窗口,因为没有其他操作。
3. 应该使用密码框的 getPassword() 方法获取密码,而不是 getText() 方法,因为 getPassword() 方法返回的是字符数组,更加安全。
以下是进行了改进的代码:
```java
package text6;
import text6.inquire;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class inquire1 extends JFrame implements ActionListener {
JLabel lbl_name = new JLabel("用户名");
JLabel lbl_pwd = new JLabel("密码");
JTextField txt_name = new JTextField();
JPasswordField txt_pwd = new JPasswordField();
JButton btn_ok = new JButton("登录");
JButton btn_cancel = new JButton("取消");
inquire dao = new inquire();
public inquire1() {
setLayout(new GridLayout(3, 2));
add(lbl_name);
add(txt_name);
add(lbl_pwd);
add(txt_pwd);
add(btn_ok);
add(btn_cancel);
btn_ok.addActionListener(this);
btn_cancel.addActionListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true);
inquire1 frm = new inquire1();
frm.setSize(200, 200);
frm.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btn_ok) {
String uname = txt_name.getText().trim();
String upwd = new String(txt_pwd.getPassword());
boolean flag = dao.validate(uname, upwd);
if (flag) {
JOptionPane.showMessageDialog(this, "用户验证通过");
this.dispose();
} else {
JOptionPane.showMessageDialog(this, "用户名或密码输入错误");
}
} else if (e.getSource() == btn_cancel) {
this.dispose();
}
}
}
```
create database student; use student; create table users( uname varchar(10) primary key, upwd varchar(10) ); insert into users values('admin','1234'); insert into users values('zhou','zhou');package homework7_二_2_20221548; import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; public class Demo { public static void main(String args[]){ MyWindow win=new MyWindow(); } } class MyWindow extends JFrame{ JLabel lbl_name=new JLabel("username"); JLabel lbl_password=new JLabel("password"); JTextField txt_name=new JTextField(15); JTextField txt_password=new JTextField(15); JButton btn1=new JButton("confirm"); JButton btn2=new JButton("cancel"); MyWindow(){ JPanel jp1=new JPanel(); jp1.setLayout(new FlowLayout()); jp1.add(lbl_name); jp1.add(txt_name); jp1.add(lbl_password); jp1.add(txt_password); add(jp1,BorderLayout.CENTER); JPanel jp2=new JPanel(); jp2.setLayout(new FlowLayout()); jp2.add(btn1); jp2.add(btn2); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String txt1=txt_name.getText(); String txt2=txt_password.getText(); String[] username=new String[2]; String[] password=new String[2]; new DemoQuery(username,password); if(txt1.equals(username[0])&&txt2.equals(password[0])) { JOptionPane.showMessageDialog(null,"欢迎您,"+username[0]+"登录"); } else if(txt1.equals(username[1])&&txt2.equals(password[1])){ JOptionPane.showMessageDialog(null,"欢迎您,"+username[1]+"登录"); } else { JOptionPane.showMessageDialog(null,"用户名和密码错误"); txt_name.setText(""); txt_password.setText(""); } } }); add(jp2,BorderLayout.SOUTH); setSize(300,150); setVisible(true); setTitle("the login window"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class DemoQuery { public DemoQuery(String[] username,String[] password){ String url = "jdbc:mysql://127.0.0.1:3306/student"; String user = "root", pwd = ""; Connection con; Statement sql; ResultSet rs; try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("test" + e); } try { con = DriverManager.getConnection(url, user, pwd); sql = con.createStatement(); String sqlStatement; sqlStatement = "SELECT * From users"; rs = sql.executeQuery(sqlStatement); while (rs.next()) { int i = 0; username[i] = rs.getString("uname"); password[i] = rs.getString("upwd"); System.out.println(username[i]+" "+password[i]); i++; } con.close(); } catch (SQLException e) { System.out.println("数据库操作失败" + e); } } }为什么用户名输入admin,密码输入1234显示登录失败?
在 DemoQuery 类里的 while 循环中,每次遍历结果集时都会将 username 和 password 数组的第一个元素赋值为当前行的 uname 和 upwd,但是在下一次遍历时,又会将其覆盖为当前行的 uname 和 upwd,因此最终 username 和 password 数组中只保存了最后一行的数据,而不是所有行的数据。因此,在 MyWindow 类中判断用户名和密码是否正确时,只能匹配到最后一行的数据,而无法匹配到第一行的数据。解决方法是将数组的定义和 i 的初始化放在 while 循环之前,每次遍历结果集时让 i 加 1,这样就可以保存所有行的数据了。修改后的 DemoQuery 类代码如下:
```java
class DemoQuery {
public DemoQuery(String[] username,String[] password){
String url = "jdbc:mysql://127.0.0.1:3306/student";
String user = "root", pwd = "";
Connection con;
Statement sql;
ResultSet rs;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("test" + e);
}
try {
con = DriverManager.getConnection(url, user, pwd);
sql = con.createStatement();
String sqlStatement;
sqlStatement = "SELECT * From users";
rs = sql.executeQuery(sqlStatement);
int i = 0;
while (rs.next()) {
username[i] = rs.getString("uname");
password[i] = rs.getString("upwd");
System.out.println(username[i]+" "+password[i]);
i++;
}
con.close();
} catch (SQLException e) {
System.out.println("数据库操作失败" + e);
}
}
}
```
另外,还需要把 MyWindow 类中的判断条件改为:
```java
if(txt1.equals(username[0])&&txt2.equals(password[0])) {
JOptionPane.showMessageDialog(null,"欢迎您,"+username[0]+"登录");
} else if(txt1.equals(username[1])&&txt2.equals(password[1])){
JOptionPane.showMessageDialog(null,"欢迎您,"+username[1]+"登录");
} else {
JOptionPane.showMessageDialog(null,"用户名和密码错误");
txt_name.setText("");
txt_password.setText("");
}
```
因为现在 username 和 password 数组中保存了所有行的数据,所以需要逐一判断每个元素是否与输入的用户名和密码匹配。如果匹配成功,则弹出欢迎对话框,否则弹出错误提示,并清空用户名和密码输入框。