实现不边框窗体的移动,类似于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
}
}