首先我们先看一下预览效果:
要实现这样一个界面就需要用到Java Swing相关代码:
首先我们在eclipse中创建一个Java项目,在这个项目下创建包还有相关的类
我们的项目一共分为四个java文件:
Create_GUI.java(代码)
import javax.swing.JFrame;
public class Create_GUI {
public static void Create_GUI(){
JFrame frame=new MyQQ_Frame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(()->{
Create_GUI();
});
}
}
Create_GUI就是创建一个GUI程序
JFrame是JavaSwing中的一个框架,使用它的时候要把包导入
import javax.swing.JFrame;
我们在Create_GUI下创建了一个静态方法:这个静态方法可以创建继承于JFrame的MyQQ_Frame
至于下面这行代码大家可能有点陌生:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这行代码就是你关闭窗口的时候,程序也随之退出。
记住哦,你可能关闭了窗口但是它有可能仍然在后台运行呢
好了接下来是MyQQ_Frame代码:
MyQQ_Frame的代码比较长:
那么我要分块进行讲解,最后再给大家一个全部的代码
首先我创建了一个框架这个框架继承于JFrame
public class MyQQ_Frame extends JFrame{
public MyQQ_Frame() {
//设置窗体大小
setSize(425,330);
//去除标题栏
setUndecorated(true);
//设置可见性
setVisible(true);
//设置透明度
com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.8f);
}
}
这里要注意的是:你必须先去除标题栏再设置可见性
设置透明度的时候可能会出现问题
请参照这个网址解答解决JDK访问权限问题
去掉标题栏后的你可能很高兴,但是没过多久你就发现问题了
我的窗体怎么不能移动位置了?
因为少年,你把标题栏去掉了呀!
那怎么办呢?
添加一个函数就好了
//由于没有标题栏所以界面不能拖动改变位置
//采取以下方法可以解决
//静态鼠标触发器
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
// System.out.println("鼠标按下");
//当鼠标点击时获取距离屏幕的坐标
x=e.getX();
y=e.getY();
}
});
//动态鼠标触发器
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e){
// System.out.println("鼠标拖动");
//获取当前位置的横坐标和纵坐标 left and top
//横向移动距离=横向动态坐标-鼠标点击时的横向静态坐标
//纵向移动距离=纵向动态坐标-鼠标点击时的纵向静态坐标
//设置可变化的位置 加上原来的位置即可
left=getLocation().x;
top=getLocation().y;
setLocation(left+e.getX()-x, top+e.getY()-y);
}
});
如果窗体随着鼠标的拖动相对静止运动的话:
那么窗体坐标变化和鼠标光标坐标变化是一样的
所以动态获取鼠标光标横坐标纵坐标的差值然后再加上窗口坐标就好了
接下来为了规范定义多个相同样式的控件,我定义了下面几个类
//自定义文本框
private class Create_textfield extends JTextField{
public Create_textfield(int n) {
super(n);
setFont(new Font("宋体", 1, 15));
setPreferredSize(new Dimension(215, 30));
}
}
//自定义密码框
private class Create_codefield extends JPasswordField{
public Create_codefield(int n) {
super(n);
setFont(new Font("宋体", 1, 15));
setPreferredSize(new Dimension(215, 30));
}
}
//自定义标签
private class Create_label extends JLabel{
public Create_label(String name,Color color) {
super(name);
setFont(new Font("微软雅黑", 1, 40));
setForeground(color);
setHorizontalAlignment(SwingConstants.CENTER);
}
}
//自定义按钮
private class Create_Login_Button extends JButton{
public Create_Login_Button(String text) {
super(text);
setBackground(new Color(0,191,255));
setPreferredSize(new Dimension(215, 37));
setForeground(Color.white);
setFocusPainted(false);
setFont(new Font("微软雅黑", 1, 15));
setHorizontalAlignment(SwingConstants.CENTER);
}
}
这样创建这些控件就显得方便了:
//写文字QQ
JLabel qq=new Create_label("2020",Color.white);
//用户名输入框
JTextField userfield=new Create_textfield(10);
//密码输入框
JPasswordField codefield=new Create_codefield(10);
//登录按钮
JButton button=new Create_Login_Button("登录");
接下来就是布局了,这里面我自己定义了一个布局SimpleLayout
定义这个布局需要两个java文件
一个在simpleLayout.java里写,一个在MyQQ_Frame.java里写
首先在simpleLayout.java里面:
public abstract class simpleLayout implements LayoutManager{
@Override
public void addLayoutComponent(String name, Component comp) {
// TODO 自动生成的方法存根
}
@Override
public void removeLayoutComponent(Component comp) {
// TODO 自动生成的方法存根
}
@Override
public Dimension preferredLayoutSize(Container parent) {
// TODO 自动生成的方法存根
return null;
}
@Override
public Dimension minimumLayoutSize(Container parent) {
// TODO 自动生成的方法存根
return null;
}
// @Override
// public void layoutContainer(Container parent) {
// // TODO 自动生成的方法存根
//
// }
}
注意我这里故意让它不实现这个重写方法:
为什么我要这么做呢?
因为它重写的那几个方法太多了,而我想用的仅仅是这里面的一个方法
而我把不用那4个方法删除的话,编译器会报错。它会让你改为抽象类或者实现没有实现的方法。大家知道这个抽象类是不能够实例化的,需要继承才能用。
所以我就另写一个文件来实现全部方法,唯独不实现这个方法:
@Override
public void layoutContainer(Container parent) {
// TODO 自动生成的方法存根
}
让这个类变为抽象的
然后回到原来的文件(MyQQ_Frame.java)
定义一个类来继承它,这样不就可以实现未实现的,就是你刚刚注释掉的
方法了。
private class SimpleLayout extends simpleLayout{
//实现被注释掉的方法
@Override
public void layoutContainer(Container parent) {
}
}
这回就只需要实现这一个我们想要的方法了,是不是棒极了?
那么这个方法要怎么写呢?
看看下面你就懂了:
private class SimpleLayout extends simpleLayout{
public void layoutContainer(Container parent) {
// TODO 自动生成的方法存根
//获取面板的宽高
//Rectangle是矩形
Rectangle rect =parent.getBounds();
//users是前面定义的控件JLabel
//如果它可见的话isVisible()
if(users.isVisible()){
//获取users尺寸
Dimension size=users.getPreferredSize();
//rect是面板(矩形)
//这个users的位置是可以随着面板大小变化的
//横坐标位置
int x=rect.width*1/5+15;
//纵坐标位置
int y=rect.height*1/2;
//setBounds(x,y,宽度,高度)
users.setBounds(x, y, size.width, size.height);
}
}
//这个布局器的厉害在于用户改变面板大小,控件位置会随之变化
//如果你说那我不想这么样我只想把控件位置定死
//可以呀
if(bg.isVisible()){
//好了这样就位置大小就定死了
bg.setBounds(0, -5, 440, 130);
}
}
好了布局器写好了,接下来怎么使用呢?
很简单:创建对象就好了
//jPanel是一个面板比Container好用多了
jPanel.setLayout(new SimpleLayout());
这里还有一个问题
就是我们知道Java Swing是有自己默认一个容器的,我们怎么取代这个容器
把Jpanel作为顶层容器呢?
//创建容器JPanel
JPanel jPanel=new JPanel();
//取代顶层容器
this.setContentPane(jPanel);
//设置背景
jPanel.setBackground(Color.white);
jPanel.setOpaque(true);
//设置布局
jPanel.setLayout(new SimpleLayout());
//我们还可以添加控件
jPanel.add(new JButton("牛牛"));
好了定位布局都会了,接下来就是引入图片了
那有什么好的图片网站吗?
当然有,这是阿里妈妈的网站:阿里巴巴图标库
下载就可以了
展示一下:
点击下载:
图标下载好了,怎么用呢?
首先我们要在刚刚的java项目下新建一个包,命名为img
把图片复制进去就ok
接下来就是代码了:
//资源文件路径
URL url0=getClass().getResource("/img/users.png");
URL url1=getClass().getResource("/img/code.png");
URL url2=getClass().getResource("/img/close.png");
URL url3=getClass().getResource("/img/bg.JPG");
URL url4=getClass().getResource("/img/qq0.png");
//声明图标
Icon users_icon=new ImageIcon(url0);
Icon codes_icon=new ImageIcon(url1);
Icon close_icon=new ImageIcon(url2);
Icon bg_icon=new ImageIcon(url3);
Icon touxiang=new ImageIcon(url4);
记住这些是相对路径,不用怕。
对照我上面的图片你就懂
那这些图片怎么用呢?
看这个代码:
//承接用户名图标
JLabel users=new JLabel();
//承接密码图标
JLabel codes=new JLabel();
//承接关闭图标
JButton close=new JButton();
//承接背景图片
JLabel bg=new JLabel();
//承接头像图片
JLabel tx=new JLabel();
//向控件中添加图标
users.setIcon(users_icon);
codes.setIcon(codes_icon);
close.setIcon(close_icon);
bg.setIcon(bg_icon);
close.setIcon(close_icon);
tx.setIcon(touxiang);
//现在控件中有图标了
//把带有图标的控件加到容器中
//添加用户图标
jPanel.add(users);
//添加密码
codefield.setBorder(matteBorder);
jPanel.add(codefield);
接下来给大家讲解一下控件的美化
如何修改文本框只有一个下滑线?
设置边框就得
//设置边框
//MatteBorder(上,左,下,右,颜色)
MatteBorder matteBorder=new MatteBorder(0, 0, 1, 0, Color.gray);
userfield.setBorder(matteBorder);
JButton不好看怎么办?
JButton log=new JButton("登录");
//创建空边框
Border border=BorderFactory.createEmptyBorder(1, 1, 1, 1);
//取消JButton里面的内边距
log.setFocusPainted(false);
//设置尺寸
log.setPreferredSize(new Dimension(50, 30));
//按钮颜色
log.setBackground(new Color(0,131,255));
为我们的JButton添加边框
log.setBorder(border);
好了现在我们大功告成了
离成功就差一步
我们由于去掉了标题栏
我们的controlBox没了
我怎么关闭呀?
这个关闭按钮需要自己写一个
//手写关闭按钮
//背景图片为×在阿里找呀
//首先我们美化一下我们的JButton
Border border=BorderFactory.createEmptyBorder(1, 1, 1, 1);
close.setFocusPainted(false);
close.setPreferredSize(new Dimension(50, 30));
close.setBackground(new Color(0,131,255));
close.setBorder(border);
//设置监听事件
close.addMouseListener(new MouseAdapter() {
//鼠标放在按钮下面的颜色
public void mouseEntered(MouseEvent e){
close.setBackground(Color.red);
}
//鼠标离开按钮的颜色
public void mouseExited(MouseEvent e) {
// TODO 自动生成的方法存根
close.setBackground(new Color(0,131,255));
}
});
//设置点击按钮事件
close.addActionListener((e)->{
//退出程序
this.dispose();
});
好了讲解结束
接下来贴全部代码:
Creat_GUI.java
package 模拟QQ登陆;
import javax.swing.JFrame;
public class Create_GUI {
public static void Create_GUI(){
JFrame frame=new MyQQ_Frame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(()->{
Create_GUI();
});
}
}
MyQQ_Frame.java
package 模拟QQ登陆;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.net.URL;
import java.text.DecimalFormat;
import javax.swing.BorderFactory;
import javax.swing.Icon;
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 javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.MatteBorder;
public class MyQQ_Frame extends JFrame{
int x,y;
//承接用户名图标
JLabel users=new JLabel();
//承接密码图标
JLabel codes=new JLabel();
//承接关闭图标
JButton close=new JButton();
//承接背景图片
JLabel bg=new JLabel();
//承接头像图片
JLabel tx=new JLabel();
//写文字QQ
JLabel qq=new Create_label("2020",Color.white);
//用户名输入框
JTextField userfield=new Create_textfield(10);
//密码输入框
JPasswordField codefield=new Create_codefield(10);
//登录按钮
JButton button=new Create_Login_Button("登录");
//资源文件路径
URL url0=getClass().getResource("/img/users.png");
URL url1=getClass().getResource("/img/code.png");
URL url2=getClass().getResource("/img/close.png");
URL url3=getClass().getResource("/img/bg.JPG");
URL url4=getClass().getResource("/img/qq0.png");
//声明图标
Icon users_icon=new ImageIcon(url0);
Icon codes_icon=new ImageIcon(url1);
Icon close_icon=new ImageIcon(url2);
Icon bg_icon=new ImageIcon(url3);
Icon touxiang=new ImageIcon(url4);
int left,top;
//构造方法
public MyQQ_Frame() {
//设置窗体大小
setSize(425,330);
//去除标题栏
setUndecorated(true);
//设置可见性
setVisible(true);
// 设置窗体透明度
com.sun.awt.AWTUtilities.setWindowOpacity(this, 0.8f);
//由于没有标题栏所以界面不能拖动改变位置
//采取以下方法可以解决
//静态鼠标触发器
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
// System.out.println("鼠标按下");
//当鼠标点击时获取距离屏幕的坐标
x=e.getX();
y=e.getY();
}
});
//动态鼠标触发器
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e){
// System.out.println("鼠标拖动");
//获取当前位置的横坐标和纵坐标 left and top
//横向移动距离=横向动态坐标-鼠标点击时的横向静态坐标
//纵向移动距离=纵向动态坐标-鼠标点击时的纵向静态坐标
//设置可变化的位置 加上原来的位置即可
left=getLocation().x;
top=getLocation().y;
setLocation(left+e.getX()-x, top+e.getY()-y);
}
});
//创建容器JPanel
JPanel jPanel=new JPanel();
//取代顶层容器
this.setContentPane(jPanel);
//添加图标
users.setIcon(users_icon);
codes.setIcon(codes_icon);
close.setIcon(close_icon);
bg.setIcon(bg_icon);
close.setIcon(close_icon);
tx.setIcon(touxiang);
//设置背景
jPanel.setBackground(Color.white);
jPanel.setOpaque(true);
//设置布局
jPanel.setLayout(new SimpleLayout());
//添加文本框
MatteBorder matteBorder=new MatteBorder(0, 0, 1, 0, Color.gray);
userfield.setBorder(matteBorder);
jPanel.add(userfield);
//添加用户图标
jPanel.add(users);
//添加密码
codefield.setBorder(matteBorder);
jPanel.add(codefield);
Border border=BorderFactory.createEmptyBorder(1, 1, 1, 1);
close.setFocusPainted(false);
close.setPreferredSize(new Dimension(50, 30));
close.setBackground(new Color(0,131,255));
close.setBorder(border);
close.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e){
close.setBackground(Color.red);
}
public void mouseExited(MouseEvent e) {
// TODO 自动生成的方法存根
close.setBackground(new Color(0,131,255));
}
});
close.addActionListener((e)->{
this.dispose();
});
jPanel.add(close);
jPanel.add(codes);
jPanel.add(tx);
jPanel.add(qq);
jPanel.add(bg);
jPanel.add(button);
button.addActionListener((e)->{
String names=userfield.getText();
@SuppressWarnings("deprecation")
String mima=codefield.getText();
users []yonghu=new users[5];
for(int q=0;q<5;q++){
yonghu[q]=new users();
}
yonghu[0].users="3320938770";
yonghu[1].users="1321824584";
yonghu[2].users="2939634393";
yonghu[3].users="1812352723";
yonghu[4].users="1369286377";
int count=0;
for(int i=0;i<5;i++){
if(yonghu[i].users.equals(names)&&mima.equals("123")){
count++;
}
}
if(count==1){
JOptionPane.showConfirmDialog(jPanel, "登录成功", "提示", JOptionPane.DEFAULT_OPTION);
this.dispose();
}
else{
JOptionPane.showMessageDialog(this,"没有注册","登录失败",JOptionPane.WARNING_MESSAGE);
}
});
}
private class Create_textfield extends JTextField{
public Create_textfield(int n) {
super(n);
setFont(new Font("宋体", 1, 15));
setPreferredSize(new Dimension(215, 30));
}
}
private class Create_codefield extends JPasswordField{
public Create_codefield(int n) {
super(n);
setFont(new Font("宋体", 1, 15));
setPreferredSize(new Dimension(215, 30));
}
}
private class Create_label extends JLabel{
public Create_label(String name,Color color) {
super(name);
setFont(new Font("微软雅黑", 1, 40));
setForeground(color);
setHorizontalAlignment(SwingConstants.CENTER);
}
}
private class Create_Login_Button extends JButton{
public Create_Login_Button(String text) {
super(text);
setBackground(new Color(0,191,255));
setPreferredSize(new Dimension(215, 37));
setForeground(Color.white);
setFocusPainted(false);
setFont(new Font("微软雅黑", 1, 15));
setHorizontalAlignment(SwingConstants.CENTER);
}
}
//见包中simpleLayout 抽象类
private class SimpleLayout extends simpleLayout{
@Override
public void layoutContainer(Container parent) {
// TODO 自动生成的方法存根
Rectangle rect =parent.getBounds();
if(bg.isVisible()){
Dimension size=bg.getPreferredSize();
bg.setBounds(0, -5, 440, 130);
}
if(users.isVisible()){
Dimension size=users.getPreferredSize();
int x=rect.width*1/5+15;
int y=rect.height*1/2;
users.setBounds(x, y, size.width, size.height);
}
if(userfield.isVisible()){
Dimension size=userfield.getPreferredSize();
int x=rect.width*1/5+30;
int y=rect.height*1/2+1;
userfield.setBounds(x, y, 215, 20);
}
if(codes.isVisible()){
Dimension size=codes.getPreferredSize();
int x=rect.width*1/5+15;
int y=rect.height*1/2+42;
codes.setBounds(x, y, size.width, size.height);
}
if(codefield.isVisible()){
Dimension size=codefield.getPreferredSize();
int x=rect.width*1/5+30;
int y=rect.height*1/2+39;
codefield.setBounds(x, y, 215, 20);
}
if(tx.isVisible()){
Dimension size=tx.getPreferredSize();
int x=(rect.width-size.width)/3+5;
int y=44;
tx.setBounds(x, y, size.width,size.height );
}
if(qq.isVisible()){
Dimension size=qq.getPreferredSize();
int x=(rect.width-size.width)/3+85;
int y=42;
qq.setBounds(x, y, size.width, size.height);
}
if(button.isVisible()){
Dimension size=button.getPreferredSize();
int x=(rect.width-size.width)/2+12;
int y=rect.height*1/2+89;
button.setBounds(x, y, size.width, size.height);
}
if(close.isVisible()){
Dimension size=close.getPreferredSize();
int x=rect.width-size.width;
int y=0;
close.setBounds(x, y, size.width, size.height);
}
}
}
}
simple_Layout.java
package 模拟QQ登陆;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
public abstract class simpleLayout implements LayoutManager{
@Override
public void addLayoutComponent(String name, Component comp) {
// TODO 自动生成的方法存根
}
@Override
public void removeLayoutComponent(Component comp) {
// TODO 自动生成的方法存根
}
@Override
public Dimension preferredLayoutSize(Container parent) {
// TODO 自动生成的方法存根
return null;
}
@Override
public Dimension minimumLayoutSize(Container parent) {
// TODO 自动生成的方法存根
return null;
}
// @Override
// public void layoutContainer(Container parent) {
// // TODO 自动生成的方法存根
//
// }
}
Users.java
package 模拟QQ登陆;
public class users {
public String users;
public String codes;
public users() {
codes="123";
}
}
图片可能没有哈,那个路径你要改改
谢谢大家支持!!!
loving you