无边框窗体随着鼠标的移动而移动,类似于qq的登录界面

实现不边框窗体的移动,类似于qq的登录界面,关键是要在当鼠标按下时就获得在窗口中当前的位置,代码:
ct.addMouseListener(new MouseAdapter() {
         public void mousePressed(MouseEvent e){
//按下(mousePressed 不是点击,而是鼠标被按下没有抬起)
    int originX = e.getX();// 获得窗口当前的位置
                    int originY = e.getY();
}
    });
  然后获得窗口相对于屏幕的当前的位置 Point p1 =this.getLocationOnScreen(); p1.getX();p1.getY();和鼠标按下移动相对于窗口的位置
public void mouseDragged(MouseEvent e) {
  //拖动(mouseDragged 指的不是鼠标在窗口中移动,而是用鼠标拖动)
p1 = new Point();
     p1 =this.getLocationOnScreen();
     //e.getX()、e.getY()是现对于窗体的位置,
     //e.getXOnScreen()、e.getYOnScreen()是相对屏幕的位置
      //设置窗口的位置
        //这是窗体移动的核心:窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置
     setLocation(p1.x+e.getX()-originX,p1.y+e.getY()-originY);
}

不懂的地方可以跟帖提问,奉上完整代码:
/**
* 功能:登录界面,可以实现无边框窗体随着鼠标的移动而移动,类似于qq的登录界面
*
*/
package com.Login;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.*;

import com.Model.UserModel;

public class Login extends JFrame implements MouseMotionListener{

//定义组件
JLabel jl1,jl2,jl3,jl4,jl5,jl6;
JTextField juser;
JPasswordField jpasswd;
JButton jlg,jcl;
Date d1;
SimpleDateFormat df1,df2;
String uName ;
String pwd ;

UserModel um;
boolean b ;

Point p1 ;//当鼠标按下时记录其位置
int originX,originY;

public static void main(String[] args) {
// TODO Auto-generated method stub
new Login();
}


public Login(){
//得到当前的容器
final Container ct = this.getContentPane();
this.setLayout(null);
//添加用户名
jl1 = new JLabel("用户名:");
jl1.setFont(new Font("宋体",Font.PLAIN,16));
jl1.setBounds(170,120,90,30);
ct.add(jl1);
//添加密码
jl2 = new JLabel("密 码:");
jl2.setFont(new Font("宋体",Font.PLAIN,16));

jl2.setBounds(170,160,90,30);
ct.add(jl2);

//添加文本框
juser = new JTextField();
juser.setFont(new Font("宋体",Font.PLAIN,12));
juser.setBounds(230,127, 100, 20);
//设置文本框为 下凹 的
juser.setBorder(BorderFactory.createLoweredBevelBorder());
ct.add(juser);
jpasswd = new JPasswordField(10);
jpasswd.setFont(new Font("宋体",Font.PLAIN,12));
jpasswd.setBounds(230,167,100,20);
//设置文本框为 下凹 的
jpasswd.setBorder(BorderFactory.createLoweredBevelBorder());
ct.add(jpasswd);
//
juser.addActionListener(this);
jpasswd.addActionListener(this);


//添加按钮
//jlg = new JButton("登陆");
jlg.setForeground(Color.blue);//设置前景色(字体)
jlg.setFont(new Font("宋体",Font.PLAIN,12));
jlg.setBounds(190,210,49,19);
ct.add(jlg);
//jcl = new JButton("退出");
jcl.setForeground(Color.blue);//设置前景色(字体)
jcl.setFont(new Font("宋体",Font.PLAIN,12));
jcl.setBounds(270,210,49,19);
ct.add(jcl);

//创建BackImage对象
BackImage bi = new BackImage();
//确定背景图片的位置
bi.setBounds(0, 0, 500, 300);
ct.add(bi);//把bi加入容器

setBounds(0,0, 350,250);
setUndecorated(true);//不使用上下修饰框
this.setSize(500,300);

//得到屏幕的宽度和高度
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
setLocation(width/4,height/3);
setAlwaysOnTop(true);//设置面板总在最前面显示
ct.addMouseMotionListener(this);
ct.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e){
//按下(mousePressed 不是点击,而是鼠标被按下没有抬起)
originX = e.getX();
originY = e.getY();
}
});
setVisible(true);
}

//内部类
class BackImage extends JPanel{
Image im;
//构造函数
public BackImage(){
try {
//添加图片
im = ImageIO.read(new File("images//1.JPG"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//画出图片
public void paintComponent(Graphics g){
g.drawImage(im,0,0,500,300, this);
}
}

@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
//拖动(mouseDragged 指的不是鼠标在窗口中移动,而是用鼠标拖动)
p1 = new Point();
p1 =this.getLocationOnScreen();
//e.getX()、e.getY()是现对于窗体的位置,
//e.getXOnScreen()、e.getYOnScreen()是相对屏幕的位置
//设置窗口的位置
//窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置
setLocation(p1.x+e.getX()-originX,p1.y+e.getY()-originY);
}


@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值