zoukankan      html  css  js  c++  java
  • 鼠标拖拽移动Java界面组件

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

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

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

      1 package com.jebysun.test.globalhotkey;
      2 
      3 import java.awt.Color;
      4 import java.awt.Cursor;
      5 import java.awt.Point;
      6 import java.awt.event.MouseEvent;
      7 
      8 import javax.swing.JLabel;
      9 import javax.swing.JWindow;
     10 import javax.swing.event.MouseInputListener;
     11 
     12 /**
     13  * 自定义程序窗口,鼠标可拖拽移动其位置。
     14  * @author Jeby Sun
     15  *
     16  */
     17 public class MyFrame extends JWindow {
     18 
     19     private static final long serialVersionUID = 1L;
     20     
     21     JLabel titleLbl;
     22     
     23     public MyFrame() {
     24         //设置背景颜色不能直接调用其setBackground方法,而要设置其ContentPane的背景颜色。
     25         this.getContentPane().setBackground(new Color(0x99FF66));
     26         this.setBounds(100,100,600,400);
     27         this.setLayout(null);
     28         
     29         titleLbl = new JLabel("  自定义窗口标题栏");
     30         titleLbl.setOpaque(true);
     31         titleLbl.setBackground(new Color(0x66CC00));
     32         titleLbl.setBounds(0, 0, 600, 30);
     33         this.add(titleLbl);
     34         //鼠标事件处理类
     35         MouseEventListener mouseListener = new MouseEventListener(this);
     36         titleLbl.addMouseListener(mouseListener);
     37         titleLbl.addMouseMotionListener(mouseListener);
     38         
     39         this.setVisible(true);
     40     }
     41 
     42     /**
     43      * 鼠标事件处理
     44      * @author Jeby Sun
     45      *
     46      */
     47     class MouseEventListener implements MouseInputListener {
     48         
     49         Point origin;
     50         //鼠标拖拽想要移动的目标组件
     51         MyFrame frame;
     52         
     53         public MouseEventListener(MyFrame frame) {
     54             this.frame = frame;
     55             origin = new Point();
     56         }
     57         
     58         @Override
     59         public void mouseClicked(MouseEvent e) {}
     60 
     61         /**
     62          * 记录鼠标按下时的点
     63          */
     64         @Override
     65         public void mousePressed(MouseEvent e) {
     66              origin.x = e.getX();  
     67              origin.y = e.getY();
     68         }
     69 
     70         @Override
     71         public void mouseReleased(MouseEvent e) {}
     72 
     73         /**
     74          * 鼠标移进标题栏时,设置鼠标图标为移动图标
     75          */
     76         @Override
     77         public void mouseEntered(MouseEvent e) {
     78             this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
     79         }
     80         
     81         /**
     82          * 鼠标移出标题栏时,设置鼠标图标为默认指针
     83          */
     84         @Override
     85         public void mouseExited(MouseEvent e) {
     86             this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
     87         }
     88 
     89         /**
     90          * 鼠标在标题栏拖拽时,设置窗口的坐标位置
     91          * 窗口新的坐标位置  = 移动前坐标位置+(鼠标指针当前坐标-鼠标按下时指针的位置)
     92          */
     93         @Override
     94         public void mouseDragged(MouseEvent e) {
     95             Point p = this.frame.getLocation();
     96             this.frame.setLocation(
     97                 p.x + (e.getX() - origin.x), 
     98                 p.y + (e.getY() - origin.y));  
     99         }
    100 
    101         @Override
    102         public void mouseMoved(MouseEvent e) {}
    103         
    104     }
    105     
    106     
    107     public static void main(String[] args) {
    108         new MyFrame();
    109     }
    110 
    111 }
  • 相关阅读:
    JavaScript 23 Window
    JavaScript 22 自定义对象
    JavaScript 21 Math
    History 7 : Christianity, Science, and The Enlightenment
    History : The Atlantic Slave Trade
    History 6 : Aztec and Inca Empires / African empires 8001500
    003 几个python编程例子
    006 网络的瓶颈效应
    0212 Logistic(逻辑)回归
    002 用Python打印九九乘法表与金字塔(*)星号
  • 原文地址:https://www.cnblogs.com/jebysun/p/3969369.html
Copyright © 2011-2022 走看看