实测:鼠标拖拽改变窗口位置这一动作应该发生在“按下鼠标”“鼠标拖拽”上,而非其他动作监听,若只实现这一功能就只需要在mousePressed、mouseDragged内添加功能。通过监听 鼠标起始位置和窗口起点位置 计算出 差值和窗口终点位置 从而重设 窗口位置 以达到跟随定位的目的。
.addMouseMotionListener(new MouseMotionAdapter() {
int OLDX,OLDY;
public void mouseDragged(MouseEvent e) {
Windows.setLocation(Windows.getLocation().x+e.getX()-OLDX,Windows.getLocation().y+e.getY()-OLDY);
}
public void mouseMoved(MouseEvent e) {
OLDX=e.getX();
OLDY=e.getY();
}
}
以下:
是一种可行但不唯一的方式,但不保证代码没有多余或是错误。
转自链接:https://www.cnblogs.com/haichun/p/3496315.html :
似乎业界的程序员都不喜欢用java来开发图形界面,但是因为跨平台的原因,对java的桌面编程非常的感兴趣,想使用它做出一套漂亮的图形界面。
此篇文章主要介绍,java下通过swing实现win8的磁力铁
原理:继承java的swing组件,对其进行功能的扩展
java swing界面的jframe中,通过setUndecorated(true)方法可以去掉周围的边框,后果是我们没法拖动这个窗口了;以下代码提供了一种方式来解决这个问题:
public class ShowMain{
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}
class MyFrame extends JFrame implements MouseListener,MouseMotionListener{
JFrame frame;
Container container;
int x;
int y;
int tempX;
int tempY;
int winX;
int winY;
int oldX;
int oldY;
public MyFrame() {
init();
}
public void init(){
frame = this;
container = frame.getContentPane();
frame.setBounds(300, 300, 300, 300);
container.setBackground(Color.BLUE);
frame.setUndecorated(true);
frame.setVisible(true);
frame.addMouseListener(this);
frame.addMouseMotionListener(this);
}
@Override
public void mouseDragged(MouseEvent e) {
Point point = e.getPoint();
Rectangle rec = frame.getBounds();
winX = (int)rec.getX();
winY = (int)rec.getY();
x = (int)point.getX();
y = (int)point.getY();
tempX = x - oldX;
tempY = y - oldY;
frame.setLocation((int)(winX + tempX), (int)(winY + tempY));
}
@Override
public void mousePressed(MouseEvent e) {
Rectangle rec = frame.getBounds();
Point point = e.getPoint();
tempX = (int)point.getX();
tempY = (int)point.getY();
oldX = (int)point.getX();
oldY = (int)point.getY();
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
运行截图(通过鼠标可以拖动一下的方块窗体):