java 拖拽目录_Java实现鼠标拖拽移动界面组件

本文介绍了一种在Java中自定义窗口并实现鼠标拖拽移动的方法。通过隐藏默认标题栏,利用MouseListener监听鼠标事件,记录鼠标按下时的位置,并在鼠标拖拽过程中更新窗口位置,实现了流畅的窗口移动效果。
摘要由CSDN通过智能技术生成

默认的,frame或者jframe自身已经实现了鼠标拖拽标题栏移动窗口的功能。

只是,当你不满意java的jframe样式,隐藏了标题栏和边框,又或者干脆直接使用jwindow,那你又该怎么实现鼠标拖拽移动窗口的目的呢?最开始,我简单的在mousedragged方法里frame.setlocation(e.getx(), e.gety()),结果,frame拖拽的时候不停地闪烁,位置在屏幕上不断跳动。后来网上查资料,找到了答案。

这里给一个简单的示例,一看就明白:

package com.jebysun.test.globalhotkey;

import java.awt.color;

import java.awt.cursor;

import java.awt.point;

import java.awt.event.mouseevent;

import javax.swing.jlabel;

import javax.swing.jwindow;

import javax.swing.event.mouseinputlistener;

/**

* 自定义程序窗口,鼠标可拖拽移动其位置。

* @author jeby sun

*

*/

public class myframe extends jwindow {

private static final long serialversionuid = 1l;

jlabel titlelbl;

public myframe() {

//设置背景颜色不能直接调用其setbackground方法,而要设置其contentpane的背景颜色。

this.getcontentpane().setbackground(new color(0x99ff66));

this.setbounds(100,100,600,400);

this.setlayout(null);

titlelbl = new jlabel(" 自定义窗口标题栏");

titlelbl.setopaque(true);

titlelbl.setbackground(new color(0x66cc00));

titlelbl.setbounds(0, 0, 600, 30);

this.add(titlelbl);

//鼠标事件处理类

mouseeventlistener mouselistener = new mouseeventlistener(this);

titlelbl.addmouselistener(mouselistener);

titlelbl.addmousemotionlistener(mouselistener);

this.setvisible(true);

}

/**

* 鼠标事件处理

* @author jeby sun

*

*/

class mouseeventlistener implements mouseinputlistener {

point origin;

//鼠标拖拽想要移动的目标组件

myframe frame;

public mouseeventlistener(myframe frame) {

this.frame = frame;

origin = new point();

}

@override

public void mouseclicked(mouseevent e) {}

/**

* 记录鼠标按下时的点

*/

@override

public void mousepressed(mouseevent e) {

origin.x = e.getx();

origin.y = e.gety();

}

@override

public void mousereleased(mouseevent e) {}

/**

* 鼠标移进标题栏时,设置鼠标图标为移动图标

*/

@override

public void mouseentered(mouseevent e) {

this.frame.setcursor(cursor.getpredefinedcursor(cursor.move_cursor));

}

/**

* 鼠标移出标题栏时,设置鼠标图标为默认指针

*/

@override

public void mouseexited(mouseevent e) {

this.frame.setcursor(cursor.getpredefinedcursor(cursor.default_cursor));

}

/**

* 鼠标在标题栏拖拽时,设置窗口的坐标位置

* 窗口新的坐标位置 = 移动前坐标位置+(鼠标指针当前坐标-鼠标按下时指针的位置)

*/

@override

public void mousedragged(mouseevent e) {

point p = this.frame.getlocation();

this.frame.setlocation(

p.x + (e.getx() - origin.x),

p.y + (e.gety() - origin.y));

}

@override

public void mousemoved(mouseevent e) {}

}

public static void main(string[] args) {

new myframe();

}

}

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值