java JFrame 分层布局与窗口拖拽事件

分层布局主要实现要依靠Undecorated与setBackground,最后放置Object.getLayerPane().add(标签/画板,new Integer(Integer.MIN_VALUE));

下面是主要的实现代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//包
public class Tests{
    //Target Graphics Address Info
    public static Dimension GetScreenBorderInfo= Toolkit.getDefaultToolkit().getScreenSize();//获取信息默认包
    public static int GetScreenWidth=(int)GetScreenBorderInfo.getWidth();//宽
    public static int GetScreenHeight=(int)GetScreenBorderInfo.getHeight();//高
    //获取屏幕大小信息
    public static boolean MousePressedJudge=false;
    private static final java.awt.Point GetToWindowsPositionInfo=new java.awt.Point();
    //储存鼠标点击前的位置
    public static void main(String[] SimpleWindowsMoveExec){

        ImageIcon DefaultOfTestsObject=new ImageIcon("图像地址");
        JLabel LoadGraphicsOfJLabel=new JLabel();
        LoadGraphicsOfJLabel.setLayout(null);
        LoadGraphicsOfJLabel.setBounds(0,0,DefaultOfTestsObject.getIconWidth()
                ,DefaultOfTestsObject.getIconHeight());
        //设置边界
        JFrame GraphicsMainWindows=new JFrame();
        GraphicsMainWindows.setUndecorated(true);
        //无原始装扮
        GraphicsMainWindows.setBackground(new Color(0,0,0, 0));
        //背景透明
        GraphicsMainWindows.setLayout(null);
        //设置自定义布局
        GraphicsMainWindows.setBounds(GetScreenWidth/2-DefaultOfTestsObject.getIconWidth()/2,
                GetScreenHeight/2-DefaultOfTestsObject.getIconHeight()/2,DefaultOfTestsObject.getIconWidth()
                ,DefaultOfTestsObject.getIconHeight());
        ///使图像总是位于最中间
        LoadGraphicsOfJLabel.setIcon(DefaultOfTestsObject);
        GraphicsMainWindows.getLayeredPane().add(LoadGraphicsOfJLabel,new Integer(Integer.MIN_VALUE));
        //接收布局放置图像
        GraphicsMainWindows.setVisible(true);
        GraphicsMainWindows.addMouseListener(new MouseAdapter() {
            //监听点击
            public void mousePressed(MouseEvent MousePressedFrontOfPosition){
                GetToWindowsPositionInfo.x=MousePressedFrontOfPosition.getX();
                GetToWindowsPositionInfo.y=MousePressedFrontOfPosition.getY();
                MousePressedJudge=true;
                //获取点击前的鼠标信息
            }
            public void mouseReleased(MouseEvent MouseReleasedFrontOfPosition){
                MousePressedJudge=false;
                //如果不属于点击状态
            }
        });
        GraphicsMainWindows.addMouseMotionListener(new MouseAdapter(){
            //监听窗口拖拽
            public void mouseDragged(MouseEvent MouseMotionTimeOfPosition){
                java.awt.Point ObtainWindowsOfPosition=GraphicsMainWindows.getLocation();
                //获取的是窗口的位置
                if (MousePressedJudge==true){
                    //判定是拖拽
                    GraphicsMainWindows.setLocation(ObtainWindowsOfPosition.x+MouseMotionTimeOfPosition.getX()-GetToWindowsPositionInfo.x,
                            ObtainWindowsOfPosition.y+MouseMotionTimeOfPosition.getY()-GetToWindowsPositionInfo.y);
                    //算法:窗口位置+拖拽位置-点击前的位置,因为你点击的位置属于窗口位置所一要减
                }
            }
        });
    }

}

如果需要限制窗口拖拽则在条件中设置区间界限.

if (MousePressedJudge==true And(( MouseMotionTimeOfPosition.getx<=xxx,MouseMotionTimeOfPosition.X>=xxx)and( MouseMotionTimeOfPosition.gety<=xxx,MouseMotionTimeOfPosition.y>=xxx))
原理都差异细微,可以将窗口对象更改成组件对象,将窗口的setLocation更改为setBounds或setLocation都行.

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtomicJun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值