拖动未修饰的 JFrame 并调整其大小

2024-04-12

目前,我正在使用以下代码来拖动和移动未装饰的 JFrame。

private void initialiseGUI(Component component){
    //<editor-fold defaultstate="collapsed" desc="code">
    component.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            posX = e.getX();
            posY = e.getY();
        }
    });

    component.addMouseMotionListener(new MouseAdapter() {
        public void mouseDragged(MouseEvent evt) {
            //sets frame position when mouse dragged            
            Rectangle rectangle = getBounds();
            getGUI().setBounds(evt.getXOnScreen() - posX, evt.getYOnScreen() - posY, rectangle.width, rectangle.height);
        }
    });
    //</editor-fold>
}

我必须写什么,以便用户可以像装饰窗口一样通过拖动侧面来调整它的大小?


你可以看看 Rob Camick 先生的组件调整器 http://tips4java.wordpress.com/2009/09/13/resizing-components/班级。使用起来非常简单直接。

只需实例化ComponentResizer并使用类似以下内容注册框架:

JFrame frame = new JFrame();
ComponentResizer cr = new ComponentResizer();
cr.registerComponent(frame);
cr.setSnapSize(new Dimension(10, 10));
cr.setMaximumSize(new Dimension(...));
cr.setMinimumSize(new Dimension(...));

这是使用该类的完整示例

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class UndecoratedExample {

    private JFrame frame = new JFrame();

    class MainPanel extends JPanel {

        public MainPanel() {
            setBackground(Color.gray);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }

    class BorderPanel extends JPanel {

        private JLabel label;
        int pX, pY;

        public BorderPanel() {
            label = new JLabel(" X ");
            label.setOpaque(true);
            label.setBackground(Color.RED);
            label.setForeground(Color.WHITE);

            setBackground(Color.black);
            setLayout(new FlowLayout(FlowLayout.RIGHT));

            add(label);

            label.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    System.exit(0);
                }
            });
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent me) {
                    // Get x,y and store them
                    pX = me.getX();
                    pY = me.getY();

                }

                 public void mouseDragged(MouseEvent me) {

                    frame.setLocation(frame.getLocation().x + me.getX() - pX,
                            frame.getLocation().y + me.getY() - pY);
                }
            });

            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(MouseEvent me) {

                    frame.setLocation(frame.getLocation().x + me.getX() - pX,
                            frame.getLocation().y + me.getY() - pY);
                }
            });
        }
    }

    class OutsidePanel extends JPanel {

        public OutsidePanel() {
            setLayout(new BorderLayout());
            add(new MainPanel(), BorderLayout.CENTER);
            add(new BorderPanel(), BorderLayout.PAGE_START);
            setBorder(new LineBorder(Color.BLACK, 5));
        }
    }

    private void createAnsShowGui() {
        ComponentResizer cr = new ComponentResizer();
        cr.setMinimumSize(new Dimension(300, 300));
        cr.setMaximumSize(new Dimension(800, 600));
        cr.registerComponent(frame);
        cr.setSnapSize(new Dimension(10, 10));
        frame.setUndecorated(true);
        frame.add(new OutsidePanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new UndecoratedExample().createAnsShowGui();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拖动未修饰的 JFrame 并调整其大小 的相关文章

  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • 在屏幕截图中捕获鼠标光标

    我正在开发 Mac 桌面应用程序 我正在使用它捕获屏幕 CGImageRef screenShot CGWindowListCreateImage CGRectInfinite kCGWindowListOptionAll kCGNullW
  • 使用 CDK Pipeline 时如何执行标准和控制

    CDK管道 https aws amazon com blogs developer cdk pipelines continuous delivery for aws cdk applications 非常棒 特别适合跨账户部署 它使开发
  • C:无法在文件上写入数据

    我想打开一个文件 在上面写一些数据 所以我必须使用 Fopen 我不能使用open 因为我在其他一些事情上需要fopen 现在 如果我想使用 fwrite 在文件上写入 我不知道为什么这就是我在代码 option1 中提到的内容 但是如果我
  • sql 查询中的错误“)”附近的语法不正确

    insert into p article client detail current article id sector detail id select article id 2818 from select article id fr
  • Solr Custom RequestHandler - 注入查询参数

    简短的问题 我正在寻找一种方法 java 来拦截对 Solr 的查询并注入我的业务逻辑提供的一些额外的过滤参数 我应该使用什么结构 语境 首先 我要坦白一点 对于 Solr 我是个菜鸟 对我来说 设置一个服务器 定义一个模式 编写一个功能性
  • 如何将 templatefile 函数传递给 Terraform 0.12 中 EC2 资源的 user_data 参数?

    我需要通过以下templatefile功能为user data在 EC2 资源中 谢谢 用户数据 tf templatefile path module init ps1 environment var env hostnames dev
  • 在R中合并多个栅格

    我一直在尝试找到一种省时的方法来在 R 中合并多个光栅图像 这些是来自乞力马扎罗南部地区的相邻 ASTER 场景 我的目标是将它们放在一起以获得一张大图像 这是我到目前为止得到的 对象 ast14dmo 代表 RasterLayer 对象列
  • 使用node.js核心zlib模块压缩成.zip文件

    如何压缩一个或多个文件并将其保存到 zip包含所提供的 node js 的扩展文件zlib https nodejs org api zlib html模块 我想出了如何保存到 gz使用 gzip 如下 const gzip zlib cr
  • 堆叠子图的对齐

    EDIT 我找到了自己的答案 见下文 如何在子图中对齐图像 for ax in axes ax set anchor W EDIT END 我有一些用 imshow 绘制的数据 它在 x 方向上很长 因此我通过在垂直堆叠的子图中绘制数据切片
  • 如何在 IntelliJ IDEA 中自定义 SonarLint 规则?

    是否可以让 SonarLint for IntelliJ IDEA 仅强制执行我在 Sonar 服务器上启用的规则 因为现在可以使用当前版本的 SonarLint 我使用的版本3 0 0 2041 https plugins jetbrai
  • Rust 中的函数是第一类对象吗?

    函数可以作为参数传递吗 例如 在 JavaScript 中 您可以将函数作为参数传递 如下所示 setInterval function 1000 他们是一流的 与 JavaScript 不同 Rust 有两种类型 函数和闭包 fn fir
  • 在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

    我正在尝试以编程方式下载 mp3 文件这个 RSS 提要 http podcast menlo church feed 当我打开一个网址时 例如 http menlohurch podbean com mf feed 5gv2gb 1702
  • 如何找到任何活动应用程序的闪烁光标位置?

    我正在为 Mac OS 开发一个应用程序 我想找到当前应用程序的文本光标 插入符号导航 的位置 到目前为止 我已经让它请求可访问权限 并且我也可以监视 keyEvents 但是如何找到闪烁的光标位置 我不是在寻找鼠标光标位置 我想要文本光标
  • 非实例化 C++ 模板函数的语义正确性

    以下 C 代码无法编译 例如使用 g 4 7 或 clang 3 2 struct Bar template
  • 如何在Python中的多个进程之间共享字典而无需锁定

    我需要在多个进程之间共享一个巨大的字典 大小约为 1 GB 但是因为所有进程都将始终从中读取 我不需要锁定 有没有办法在不锁定的情况下共享字典 python中的多处理模块提供了一个Array类 它允许通过设置共享而无需锁定锁 假然而 多处理
  • 什么是铁轨的良好伐木替代品?

    所以 我一直在研究登录我的 Rails 应用程序 我发现 感谢像这样的帖子this https stackoverflow com questions 462651 rails logger format string configurat
  • Laravel Echo - 允许访客连接到状态通道

    我正在使用 laravel echo server 运行 Laravel Echo 来广播事件 我有一个用户计数器频道 显示应用程序上的所有用户 为此 我使用了存在通道 这对于登录用户来说效果很好 但访客永远无法连接 我在 Broadcas
  • Xml序列化顺序问题

    通常 所有这些都非常适合将我的对象序列化为 Xml 字符串 然后再序列化回对象 然而 不同最终用户之间存在这种不一致 我似乎无法追踪 基本上 当我序列化一个对象时 一旦转换为 Xml 它看起来就像这样
  • 安卓。在对话框中调用关闭

    你打电话时dismiss 在对话框上 除了隐藏它之外 它还会将其从内存中删除吗 它是否会删除放置在对话框内的所有对象 例如ImageViews Buttons等等 凭记忆吗 有没有一种方法可以让我自己释放这些对象的内存 而不是等待垃圾收集器
  • 拖动未修饰的 JFrame 并调整其大小

    目前 我正在使用以下代码来拖动和移动未装饰的 JFrame private void initialiseGUI Component component