Java實現(xiàn)鼠標拖拽移動界面組件
默認的,F(xiàn)rame或者JFrame自身已經(jīng)實現(xiàn)了鼠標拖拽標題欄移動窗口的功能。
只是,當你不滿意java的JFrame樣式,隱藏了標題欄和邊框,又或者干脆直接使用JWindow,那你又該怎么實現(xiàn)鼠標拖拽移動窗口的目的呢?最開始,我簡單的在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;
/**
* 自定義程序窗口,鼠標可拖拽移動其位置。
* @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(" 自定義窗口標題欄");
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) {}
/**
* 鼠標移進標題欄時,設(shè)置鼠標圖標為移動圖標
*/
@Override
public void mouseEntered(MouseEvent e) {
this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}
/**
* 鼠標移出標題欄時,設(shè)置鼠標圖標為默認指針
*/
@Override
public void mouseExited(MouseEvent e) {
this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
/**
* 鼠標在標題欄拖拽時,設(shè)置窗口的坐標位置
* 窗口新的坐標位置 = 移動前坐標位置+(鼠標指針當前坐標-鼠標按下時指針的位置)
*/
@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)文章
Java實現(xiàn)爬取往期所有雙色球開獎結(jié)果功能示例
這篇文章主要介紹了Java實現(xiàn)爬取往期所有雙色球開獎結(jié)果功能,涉及Java網(wǎng)頁抓取、正則替換、文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Spring的同一個服務(wù)會加載多次的問題分析及解決方法
這篇文章主要介紹了Spring的同一個服務(wù)為什么會加載多次,我們先來梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10
Springboot注解之@EnableAutoConfiguration詳解
這篇文章主要介紹了Springboot注解之@EnableAutoConfiguration詳解,@EnableAutoConfiguration是一個加載Starter目錄包之外的需要Spring自動生成bean對象,本文對其進行總結(jié),需要的朋友可以參考下2023-08-08
SpringBoot過濾器如何獲取POST請求的JSON參數(shù)
這篇文章主要介紹了SpringBoot過濾器如何獲取POST請求的JSON參數(shù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

