Java實現(xiàn)鼠標(biāo)拖拽移動界面組件
默認(rèn)的,F(xiàn)rame或者JFrame自身已經(jīng)實現(xiàn)了鼠標(biāo)拖拽標(biāo)題欄移動窗口的功能。
只是,當(dāng)你不滿意java的JFrame樣式,隱藏了標(biāo)題欄和邊框,又或者干脆直接使用JWindow,那你又該怎么實現(xiàn)鼠標(biāo)拖拽移動窗口的目的呢?最開始,我簡單的在mouseDragged方法里frame.setLocation(e.getX(), e.getY()),結(jié)果,frame拖拽的時候不停地閃爍,位置在屏幕上不斷跳動。后來網(wǎng)上查資料,找到了答案。
這里給一個簡單的示例,一看就明白:
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;
/**
* 自定義程序窗口,鼠標(biāo)可拖拽移動其位置。
* @author Jeby Sun
*
*/
public class MyFrame extends JWindow {
private static final long serialVersionUID = 1L;
JLabel titleLbl;
public MyFrame() {
//設(shè)置背景顏色不能直接調(diào)用其setBackground方法,而要設(shè)置其ContentPane的背景顏色。
this.getContentPane().setBackground(new Color(0x99FF66));
this.setBounds(100,100,600,400);
this.setLayout(null);
titleLbl = new JLabel(" 自定義窗口標(biāo)題欄");
titleLbl.setOpaque(true);
titleLbl.setBackground(new Color(0x66CC00));
titleLbl.setBounds(0, 0, 600, 30);
this.add(titleLbl);
//鼠標(biāo)事件處理類
MouseEventListener mouseListener = new MouseEventListener(this);
titleLbl.addMouseListener(mouseListener);
titleLbl.addMouseMotionListener(mouseListener);
this.setVisible(true);
}
/**
* 鼠標(biāo)事件處理
* @author Jeby Sun
*
*/
class MouseEventListener implements MouseInputListener {
Point origin;
//鼠標(biāo)拖拽想要移動的目標(biāo)組件
MyFrame frame;
public MouseEventListener(MyFrame frame) {
this.frame = frame;
origin = new Point();
}
@Override
public void mouseClicked(MouseEvent e) {}
/**
* 記錄鼠標(biāo)按下時的點
*/
@Override
public void mousePressed(MouseEvent e) {
origin.x = e.getX();
origin.y = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {}
/**
* 鼠標(biāo)移進標(biāo)題欄時,設(shè)置鼠標(biāo)圖標(biāo)為移動圖標(biāo)
*/
@Override
public void mouseEntered(MouseEvent e) {
this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
/**
* 鼠標(biāo)移出標(biāo)題欄時,設(shè)置鼠標(biāo)圖標(biāo)為默認(rèn)指針
*/
@Override
public void mouseExited(MouseEvent e) {
this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
/**
* 鼠標(biāo)在標(biāo)題欄拖拽時,設(shè)置窗口的坐標(biāo)位置
* 窗口新的坐標(biāo)位置 = 移動前坐標(biāo)位置+(鼠標(biāo)指針當(dāng)前坐標(biāo)-鼠標(biāo)按下時指針的位置)
*/
@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();
}
}
相關(guān)文章
全面解析Spring Security 內(nèi)置 Filter
這篇文章主要介紹了Spring Security 內(nèi)置 Filter的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
基于mybatis-plus QueryWrapper 排序的坑
這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于springboot加載yml配置文件的no字段自動轉(zhuǎn)義問題
這篇文章主要介紹了關(guān)于springboot加載yml配置文件的no字段自動轉(zhuǎn)義問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
idea如何解決commit代碼時一直code Analyze加載的問題
文章介紹了解決Git提交代碼時出現(xiàn)codeAnalyze加載卡頓問題的方法,即關(guān)閉IDEA中的相關(guān)設(shè)置選項,作者分享個人經(jīng)驗,希望對大家有所幫助,并鼓勵支持腳本之家2025-01-01

