我会先细致的说一下我的界面设计和功能实现以及遇到的问题,然后代码会放到每块的后面展示。
所有界面除了主界面(因为主界面较简单就用了BorderLayout),其余都用的自由布局:
setLayout(null);//自由布局,然后可所以设置组件的位置
setBounds(1, 2, 3, 4);//四个参数分别为横坐标,纵坐标,所占空间的长度,所占空间的宽度
主界面:
主界面我用到了左右分屏(分屏的方式:左右是HORIZONTAL_SPLIT,上下是VERTICAL_SPLIT):
JSplitPane jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,A,B);
//分屏的方式:左右是HORIZONTAL_SPLIT,上下是VERTICAL_SPLIT
jSplitPane.setDividerLocation(300);//左边占的长度
jSplitPane.setDividerSize(0);//分界线的宽度 设置为0 即不显示出分界线
添加图片:
ImageIcon im =new ImageIcon("C:\\\\Users\\\\小甘同学\\\\Pictures\\\\d.png");//图片地址
JLabel a=new JLabel(im);//添加到JLabel里,然后就可以放到你想放的地方
package homework;
import java.awt.BorderLayout;//省略咯!!
public class 界面 extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
public 界面()
{
setTitle("登录");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,470);
this.setLocation(300,120);
JPanel A=new JPanel();
A.setBackground(Color.WHITE);
ImageIcon im =new ImageIcon("C:\\\\Users\\\\小甘同学\\\\Pictures\\\\d.png");
JLabel a=new JLabel(im);
A.add(a);
JPanel B=new JPanel(new BorderLayout());
B.setBackground(Color.PINK);
JSplitPane jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,A,B);//分屏的方式:左右HORIZONTAL_SPLIT,上下VERTICAL_SPLIT
jSplitPane.setDividerLocation(300);//左边占的长度
this.add(jSplitPane);
jSplitPane.setDividerSize(0);//分界线的宽度 设置为0 即不显示出分界线
A.setBorder(BorderFactory.createLineBorder(Color.BLUE));
B.setBorder(BorderFactory.createLineBorder(Color.BLUE));
JLabel w=new JLabel(" 我 是 ");
JButton g=new JButton("管理员");
JPanel G=new JPanel();
G.setBackground(Color.PINK);
G.add(g);
g.setContentAreaFilled(false);
JButton x=new JButton("学生");
JPanel X=new JPanel();
X.add(x);
X.setBackground(Color.PINK);
x.setContentAreaFilled(false);
B.add(w,BorderLayout.NORTH);
w.setHorizontalAlignment(SwingConstants.CENTER);//居中
w.setPreferredSize(new Dimension(0,150));//宽度150
w.setFont(new Font("楷体",Font.PLAIN,25));//设置字体的字体,样子,大小
B.add(X,BorderLayout.CENTER);
B.add(G,BorderLayout.SOUTH);
G.setPreferredSize(new Dimension(0,200));//宽度200
x.addActionListener(new ActionListener() //监听学生按钮
{
public void actionPerformed(ActionEvent e)
{
new XX();
}
});
g.addActionListener(new ActionListener() //监听管理员按钮
{
public void actionPerformed(ActionEvent e)
{
new GG();
}
});
}
public static void main(String[] args)
{
new 界面().setVisible(true);
}
}
学生登陆界面和管理员登陆界面:
两个图标在这里可自取:
按钮透明化和背景颜色:
setContentAreaFilled(false);
setBackground(Color.PINK);
验证码功能(区分大小写,点击可更换)单独写了个类:
public class ValidCode extends JComponent implements MouseListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private String code;
private int width, height = 40;
private int codeLength = 4;
private Random random = new Random();
public ValidCode() {
width = this.codeLength * 16 + (this.codeLength - 1) * 10;
setPreferredSize(new Dimension(width, height));
setSize(width, height);
this.addMouseListener(this);
setToolTipText("点击可以更换验证码");
}
public int getCodeLength() {
return codeLength;
}
//设置验证码文字的长度
public void setCodeLength(int codeLength) {
if(codeLength < 4) {
this.codeLength = 4;
} else {
this.codeLength = codeLength;
}
}
public String getCode() {
return code;
}
// 产生随机的颜色
public Color getRandColor(int min, int max) {
if (min > 255)
min = 255;
if (max > 255)
max = 255;
int red = random.nextInt(max - min) + min;
int green = random.nextInt(max - min) + min;
int blue = random.nextInt(max - min) + min;
return new Color(red, green, blue);
}
// 设置验证码具体的字母是什么
protected String generateCode() {
char[] codes = new char[this.codeLength];
for (int i = 0, len = codes.length; i < len; i++) {
if (random.nextBoolean()) {
codes[i] = (char) (random.nextInt(26) + 65);
} else {
codes[i] = (char) (random.nextInt(26) + 97);
}
}
this.code = new String(codes);
return this.code;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(this.code == null || this.code.length() != this.codeLength) {
this.code = generateCode();
}
width = this.codeLength * 16 + (this.codeLength - 1) * 10;
super.setSize(width, height);
super.setPreferredSize(new Dimension(width, height));
Font mFont = new Font("Arial", Font.BOLD | Font.ITALIC, 25);
g.setFont(mFont);
//绘制出验证码的背景的矩形轮廓
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(getRandColor(200, 250));
g2d.fillRect(0, 0, width, height);
g2d.setColor(getRandColor(180, 200));
g2d.drawRect(0, 0, width - 1, height - 1);
//绘制出验证码背景的线
int i = 0, len = 150;
for (; i < len; i++) {
int x = random.nextInt(width - 1);
int y = random.nextInt(height - 1);
int x1 = random.nextInt(width - 10) + 10;
int y1 = random.nextInt(height - 4) + 4;
g2d.setColor(getRandColor(180, 200));
g2d.drawLine(x, y, x1, y1);
}
//绘制出验证码的具体字母
i = 0; len = this.codeLength;
FontMetrics fm = g2d.getFontMetrics();
int base = (height - fm.getHeight())/2 + fm.getAscent();
for(;i<len;i++) {
int b = random.nextBoolean() ? 1 : -1;
g2d.rotate(random.nextInt(10)*0.01*b);
g2d.setColor(getRandColor(20, 130));
g2d.drawString(code.charAt(i)+"", 16 * i + 10, base);
}
}
//下一个验证码
public void nextCode() {
generateCode();
repaint();
}
因为两个界面基本一样,仅展示学生登陆界面代码:
package homework;
import java.awt.Color;//省略咯!!
public class XX extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private ValidCode vcode = new ValidCode();
JTextField co;
static JTextField user;
JPasswordField pass;
JButton ok,register;
public XX()
{
super("学生登陆");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setSize(450,350);
this.setLocationRelativeTo(null);
setVisible(true);
//将整体设为粉色背景
JPanel frame=new JPanel();
frame.setBackground(Color.PINK);
this.add(frame);
//账号、密码所代表的图形
Icon login = new ImageIcon("C:\\\\Users\\\\小甘同学\\\\Pictures\\\\1.png");
JLabel l= new JLabel();
l.setIcon(login);
Icon password = new ImageIcon("C:\\\\Users\\\\小甘同学\\\\Pictures\\\\2.png");
JLabel p= new JLabel();
p.setIcon(password);
JLabel code=new JLabel("验证码");
code.setFont(new Font("楷体",Font.BOLD,17));
user=new JTextField();
pass=new JPasswordField();
co=new JTextField();
ok=new JButton("登录");
ok.setContentAreaFilled(false);
register=new JButton("注册");
register.setContentAreaFilled(false);
l.setBounds(80, 50, 60, 40);
p.setBounds(80, 100, 60, 40);
code.setBounds(70, 150, 60, 40);
user.setBounds(150, 50, 150, 30);
pass.setBounds(150, 100, 150, 30);
co.setBounds(150, 150, 150, 30);
ok.setBounds(120, 220, 70, 30);
register.setBounds(250, 220, 70, 30);
vcode.setBounds(310, 145, 100, 40);
frame.setLayout(null);
frame.add(l);
frame.add(p);
frame.add(code);
frame.add(user);
frame.add(pass);
frame.add(co);
frame.add(ok);
frame.add(register);
frame.add(vcode);
register.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
new ZC();
closeThis();
}
});
ok.addActionListener(new ActionListener() //监听登录按钮
{
public void actionPerformed(ActionEvent e)
{
String jusername=user.getText();
char s[]=pass.getPassword();
String jpassword=new String(s);
String coo=co.getText();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//加载对应的jdbc驱动
String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SCHOOL";//配置连接字符串
String user="sa";//sa超级管理员
String password="你的密码";//密码
Connection conn=DriverManager.getConnection(url,user,password);//创建数据库连接对象
Statement st=conn.createStatement();//创建SQL语句执行对象
Md5 md5 = new Md5();
String newString = md5.EncoderByMd5(jpassword);
String strSQL="(Select * from dbo.PY where ID='"+jusername+"'And PAWD='"+newString+"' )";
ResultSet rs=st.executeQuery(strSQL);
if(coo.isEmpty()) {
JOptionPane.showMessageDialog(null, "请输入验证码!","提示消息",JOptionPane.WARNING_MESSAGE);
}
else
{
if(!isValidCodeRight()) {
JOptionPane.showMessageDialog(null, "验证码错误,请重新输入!","提示消息",JOptionPane.WARNING_MESSAGE);
}
else {
if(rs.next())
{
new PY();
closeThis();
}
else
{