P12 JWindow 窗口

系统:Win10
Java:1.8.0_333
IDEA:2020.3.4
Gitee:https://gitee.com/lijinjiang01/JavaSwing

1.概述

JWindow:一个容器,可以显示在用户桌面上的任何位置。它没有标题栏、窗口管理按钮或者其他与 JFrame 关联的修饰,但它仍然是用户桌面的“一类居民”,可以存在于桌面上的任何位置
JWindow 组件包含一个 JRootPane 作为其仅有的子组件。contentPane 应为 JWindow 的所有子窗口的父窗口。作为一个便捷的 add 及其变体,remove 和 setLayout 已被重写并根据需要转发到 contentPane。这意味着您可以写入:

window.add(child);

JWindow 常用构造方法:

// 创建一个没有指定所有者的窗口
JWindow()
// 创建具有指定所有者框架的窗口
JWindow(Frame owner)
// 使用屏幕设备的指定GraphicsConfiguration创建一个窗口
JWindow(GraphicsConfiguration gc)

2.JWindow 代码实例

import com.lijinjiang.beautyeye.BeautyEyeLNFHelper;
import javax.swing.*;

public class Demo01 {
    public static void main(String[] args) {
        try {
            BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.generalNoTranslucencyShadow;
            BeautyEyeLNFHelper.launchBeautyEyeLNF();
        } catch (Exception e) {
        	e.printStackTrace();
        }
        JWindow window = new JWindow();
        window.setLayout(null); // 设置为空布局
        JLabel label = new JLabel("这是一个测试的JWindow窗口");
        window.add(label);
        label.setBounds(120, 130, 160, 30);
        window.setSize(400, 300); // 设置大小
        window.setLocationRelativeTo(null); // 相对屏幕居中
        window.setVisible(true); // 设置可见
    }
}

3.效果演示

在这里插入图片描述

结果我们发现,JWindow 窗口的效果好像和 JFrame 好像差不多,其实我们只要在之前 JFrame 的 Demo 中加入一行代码,也可以实现 JWindow 类似的效果

this.setUndecorated(true); // 禁用此窗口的装饰

我们发现在去除装饰或者直接使用 JWindow 窗口的时候,我们无法拖动该窗口,就无法改变该窗口的显示位置,那么是否有办法实现鼠标左键拖动该窗口呢?
答案是添加鼠标的监听事件

4.实现鼠标拖动 JWindow 窗口

代码如下:

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Demo02 {
    // 用于处理拖动事件,表示鼠标按下时的坐标,相对于JFrame
    private static int offsetX = 0;
    private static int offsetY = 0;
    // 是否是鼠标左键移动
    private static boolean leftMouse = false;


    public static void main(String[] args) {
        JWindow window = new JWindow();
        window.setLayout(null); // 设置为空布局
        JLabel label = new JLabel("这是一个测试的JWindow窗口");
        window.add(label);
        label.setBounds(120, 130, 160, 30);
        window.setSize(400, 300); // 设置大小
        window.setLocationRelativeTo(null); // 相对屏幕居中
        window.setVisible(true); // 设置可见
        // 添加鼠标监听,实现左键拖动窗口
        window.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) { // 鼠标左键按下时记录鼠标相对窗口的位置
                if (e.getButton() == MouseEvent.BUTTON1) { // 如果是鼠标左键
                    leftMouse = true;
                    offsetX = e.getX();
                    offsetY = e.getY();
                } else {
                    leftMouse = false;
                }
            }
        });
        window.addMouseMotionListener(new MouseAdapter() { // 鼠标拖动窗口
            @Override
            public void mouseDragged(MouseEvent e) {
                if (leftMouse) {
                    int x = e.getXOnScreen() - offsetX;
                    int y = e.getYOnScreen() - offsetY;
                    window.setLocation(x, y);
                }
            }
        });
    }
}

5.效果演示

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李晋江

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

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

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

打赏作者

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

抵扣说明:

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

余额充值