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;
    }
}






  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java Swing中为窗体添加背景图片,可以按照以下步骤进行操作: 1. 创建一个继承自JFrame的自定义窗体类。 2. 在该类的构造函数中设置窗体的标题、大小和关闭操作。 3. 创建一个继承自JPanel的自定义面板类,并重写其paintComponent方法来绘制背景图片。 4. 在自定义窗体类的构造函数中创建背景面板对象,并将其设置为窗体的内容面板。 下面是一个示例代码: ```java import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class BackgroundFrame extends JFrame { public BackgroundFrame() { setTitle("Background Image Demo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); BackgroundPanel backgroundPanel = new BackgroundPanel(); setContentPane(backgroundPanel); pack(); setLocationRelativeTo(null); // 居中显示窗口 } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { BackgroundFrame frame = new BackgroundFrame(); frame.setVisible(true); }); } private static class BackgroundPanel extends JPanel { private Image backgroundImage; public BackgroundPanel() { backgroundImage = new ImageIcon("path/to/your/image.jpg").getImage(); Dimension dimension = new Dimension(backgroundImage.getWidth(null), backgroundImage.getHeight(null)); setPreferredSize(dimension); } @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); graphics.drawImage(backgroundImage, 0, 0, null); } } } ``` 在上述代码中,将`path/to/your/image.jpg`替换为你自己的背景图片路径。然后运行`BackgroundFrame`类,就会显示带有背景图片的窗体。 希望这对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值