1. 程式人生 > >swing實現窗體拖拽和拉伸

swing實現窗體拖拽和拉伸

當用setUndecorated(true) 後 JFrame去掉標題欄後就得自己寫拖拽和拉伸功能了。

下面是效果圖,我的截圖軟體不能夠擷取除系統預設游標外的游標,所以各個方向游標變化在圖中沒有體現


程式碼如下:

import javax.swing.*;
import java.awt.*;

/**
 * 窗體拖拽和拉伸
 */
public class winReSizeDemo {
    private JFrame jf;
    public winReSizeDemo(){
        jf=new JFrame();
        jf.setUndecorated(true);//去標邊界和標題欄
        jf.setLocationRelativeTo(null);//視窗置中
        jf.setSize(400,400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        reSizeEvent dg = new reSizeEvent(jf);
        /**新增兩個監聽器**/
        jf.addMouseListener(dg);
        jf.addMouseMotionListener(dg);
        jf.setVisible(true);
    }
    public static void main(String [] args){
        new winReSizeDemo();
    }
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
 * 實現視窗各個方向拉伸以及拖動。
 */
public class reSizeEvent extends MouseAdapter{
    public JFrame jf;
    private Point prePos,curPos,jfPos;
    private static final double BREADTH = 15.0;//邊界拉伸範圍
    private  int dragType;
    private static final int DRAG_MOVE = 1;
    private static final int DRAG_UP = 2;
    private static final int DRAG_UPLEFT = 3;
    private static final int DRAG_UPRIGHT = 4;
    private static final int DRAG_LEFT = 5;
    private static final int DRAG_RIGHT = 6;
    private static final int DRAG_BOTTOM = 7;
    private static final int DRAG_BOTTOMLEFT = 8;
    private static final int DRAG_BOTTOMRIGHT = 9;
    public reSizeEvent(JFrame jf){
        this.jf = jf;
    }
    @Override
    public void mousePressed(MouseEvent e){
        prePos = e.getLocationOnScreen();
    }
    @Override
    public void mouseMoved(MouseEvent e){
        areaCheck(e.getPoint());
    }
    @Override
    public void mouseDragged(MouseEvent e){
        curPos = e.getLocationOnScreen();
        jfPos = jf.getLocation();
        dragAction();
        prePos = curPos;
    }
    private void dragAction(){
        switch(dragType){
            case DRAG_MOVE:
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y+curPos.y-prePos.y);
                break;
            case DRAG_UP://x位置不變,y位置變化,並且Height變化
                jf.setLocation(jfPos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth(), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_LEFT://y位置不變,x位置變化,width變化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight());
                break;
            case DRAG_RIGHT://x,y位置不變,width變化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight());
                break;
            case DRAG_BOTTOM://x,y位置不變,Height變化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth(), jf.getHeight()+(curPos.y-prePos.y));
                break;
            case DRAG_UPLEFT://x,y位置均變化,h,w均變化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_BOTTOMRIGHT://x,y位置均不變,h,w變化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
                break;
            case DRAG_UPRIGHT://x位置不變,y,w,h變化
                jf.setLocation(jfPos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_BOTTOMLEFT://y不變,xwh變化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
                break;
            default:
                break;
        }
    }
    private boolean areaCheck(Point p){
        if(p.getX()<=BREADTH && p.getY()<=BREADTH){
            dragType = DRAG_UPLEFT;
            jf.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));
        }else if(p.getX()>BREADTH
                && p.getX()<(jf.getWidth()-BREADTH)
                && p.getY()<=BREADTH){
            dragType = DRAG_UP;
            jf.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH) && p.getY()<=BREADTH){
            dragType = DRAG_UPRIGHT;
            jf.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR));
        }else if(p.getX()<=BREADTH
                && p.getY()<(jf.getHeight()-BREADTH)
                && p.getY()>BREADTH){
            dragType = DRAG_LEFT;
            jf.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH)
                && p.getY()<(jf.getHeight()-BREADTH)
                && p.getY()>BREADTH){
            dragType = DRAG_RIGHT;
            jf.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
        }else if(p.getX()<=BREADTH
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOMLEFT;
            jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR));
        }else if(p.getX()>BREADTH
                && p.getX()<(jf.getWidth()-BREADTH)
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOM;
            jf.setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH)
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOMRIGHT;
            jf.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
        }else{
            dragType = DRAG_MOVE;
            jf.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            return false;
        }
        return true;
    }
}



相關推薦

swing實現窗體

當用setUndecorated(true) 後 JFrame去掉標題欄後就得自己寫拖拽和拉伸功能了。下面是效果圖,我的截圖軟體不能夠擷取除系統預設游標外的游標,所以各個方向游標變化在圖中沒有體現程式碼如下:import javax.swing.*; import java.

【JavaScript】實現元素碰撞檢測

function drag() { var src1 = document.getElementById("src-1"); var src2 = document.getElementById("src-2"); var src3 =

安卓實現任意控制元件view可,並監聽點選事件,可自動回螢幕邊緣

因為專案中有需要實現控制元件可任意拖拽的需求,所以簡單寫了個自定義OnTouchListener,以作拋磚引玉,歡迎大家提議反饋。 完整實現類如下,程式碼中有詳細註釋: 使用者可以決定是否開啟自動拖拽邊緣功能,可以監聽控制元件的拖拽和點選事件 public cl

winform 無邊框窗體實現

sed style windows part fse use left clas void using System; using System.Collections.Generic; using System.ComponentModel; using Syst

Android一步一步帶你實現RecyclerView的側滑刪除功能

先上效果圖: 本篇文章我們來學習一個開源專案Android-ItemTouchHelper-Demo 這個專案使用了RecyclerView的ItemTouchHelper類實現了Item的拖動和刪除功能,ItemTouchHelper是v7包下的一個類

Android 可的GridView效果實現, 長按可item實時交換

在Android開發中,我們常常用到ListView和GridView,而有的時候系統的ListView,GridView並不能滿足我們的需求,所以我們需要自己定義一個ListView或者GridView,我的上一篇文章中就是自定義的一個左右滑動刪除item的例子,大家有興趣

vb.net 實現無標題欄窗體功能

<pre name="code" class="vb">'較好用,沒有閃動 Declare Auto Function ReleaseCapture Lib "user32.dll" Alias "ReleaseCapture" () As Boolea

微信小程式(遊戲)----拼圖(切換功能的實現

效果圖 touchstart 獲取當前觸控位置的座標(x,y); 記錄觸控點下view的各項座標值; 記錄觸控點下view的起點座標,背景座標,以及觸控點的座標; 設定拖拽view為顯示狀

QWidget無邊框無標題欄窗體動可

    通常我們不想使用QMainWindow提供的標題欄,或者是QWidget的標題欄、邊框,這時候我們使用了一個普通的QWidget,沒有標題欄沒有邊框,但我們又需要有標題欄拖動的功能,邊框改變大小的功能,看上去是個很矛盾的想法,所以...我們只能自己實現了。    

Android 可的GridView效果實現, 長按可item實時交換

在Android開發中,我們常常用到ListView和GridView,而有的時候系統的ListView,GridView並不能滿足我們的需求,所以我們需要自己定義一個ListView或者GridView,我的上一篇文章中就是自定義的一個左右滑動刪除item的例子

Android開發之RecyclerView的互動動畫(實現刪除)

做RecyclerView做相關的動畫效果的時候,用的最多的是v7包下的ItemTouchHelper類,這個類很強大,如有興趣的童鞋可以自行翻看原始碼,接下來我帶領大家實現RecyclerView相關的互動動畫。大家看下面的效果(拖拽和刪除): ------------

C# 各種控件實現調整大小

osi 鼠標拖動 clas 鼠標 pan lin tool 右下角 enum http://www.360doc.com/content/18/0516/12/55659281_754382494.shtml using System; using System.Colle

實現移動的懸浮按鈕

前言:   最近想要實現一個可拖拽移動的FAB按鈕,這裡記錄一下個人的思路與經驗。 如何監聽FAB按鈕的移動?   我們可以實現View.OnTouchListener介面,在onTouch( )方法中獲取FAB按鈕移動時的位置引數。或者可以選擇複寫View自身的onT

Android實現的懸浮框

前言:   最近遇到一個開發需求,機器人在使用ASR(語音識別)時,需要將使用者說的話,在機器人胸前的互動螢幕上展示出來,也就是展示出相應的字幕。關鍵有一個要求就是可將字幕進行拖拽。。。(怎麼樣,這個需求夠變態吧,雖從正常互動的角度認為這樣完全沒必要,並簡單交涉了下,結果很無奈,你懂得。

WPF MVVM模式中,通過命令實現窗體動、跳轉以及顯隱控制

原文: WPF MVVM模式中,通過命令實現窗體拖動、跳轉以及顯隱控制 在WPF中使用MVVM模式,可以讓我們的程式實現介面與功能的分離,方便開發,易於維護。但是,很多初學者會在使用MVVM的過程中遇到一個顯而易見且無法迴避的問題,那就是不同的窗體之間如何跳轉?很多人在介紹MVVM的使用時,都沒有明顯提到該

WPF 實現窗體

mouse down left highlight 窗體拖動 arp sed ons += C# 實現代碼 this.Loaded += (r, s) => { this.MouseDown += (x, y) => {

詳細講解html5放技術的區別及優勢

提到拖拽,我們都很熟悉,那麼拖放呢?一字之差,代表的意義是不一樣的,拖拽就是拉著走,拖放就是有拖,有放,我們都知道原生 JS 拖拽效果的缺點:1. 程式碼相對複雜與冗餘2. 僅限於在瀏覽器內的元素間拖放3、不能實現跨頁面的拖放 所以H5就出現了拖放技術,與 JS 原生相比 HTML5 拖放的優勢

基於Vue實現可以排序的樹形表格

專案需要一個可以拖拽排序的樹形表格,github上搜了一下,併為找到,大部分都不支援拖拽,所以自己實現了一個簡單的元件,已開源 原始碼在這裡,併發布到npm上,如果有類似需求可以試一下,chrome上沒有任何問題 效果圖如下: drag-tree-table 使用方式

RecycleView裡面的item 滑動刪除

找到一個寫的很好的: RecyclerView進階:使用ItemTouchHelper實現拖拽和側滑刪除 注: 滑動刪除的時候,注意不要下標越界: public void onItemDelete(int position) { if (data.size() &g

基於Vue實現可以的樹形表格(原創)

  因業務需求,需要一個樹形表格,並且支援拖拽排序,任意未知插入,github搜了下,真不到合適的,大部分樹形表格都沒有拖拽功能,所以決定自己實現一個。這裡分享一下實現過程,專案原始碼請看github,外掛已打包封裝好,釋出到npm上  本博文會分為兩部分,第一部分為使用方式,第二部分為實現方式 安裝方式