You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在鼠标释放时仅捕获一次JFrame resize调整大小事件

你遇到的问题是Swing的componentResized事件会在窗口尺寸变化时实时连续触发,而非仅在调整结束后触发。可以通过以下两种成熟方案实现仅在调整结束后执行一次逻辑:

方案1:防抖计时器实现(通用首选,适配鼠标/键盘等所有调整窗口大小的场景)

核心逻辑是每次触发resize事件时重置延迟计时器,只有当连续N毫秒(推荐200~300ms,可自行调整)没有新的resize事件触发时,才执行你需要的逻辑,这个间隔足够覆盖拖拽调整过程中连续触发的事件间隙。
代码示例:

// 声明Swing计时器,注意用javax.swing.Timer,保证回调在事件调度线程执行
Timer resizeTimer = new Timer(200, e -> {
    System.out.println("BLAH");
    // 这里写你调整结束后要执行的其他逻辑
});
resizeTimer.setRepeats(false); // 计时器只执行一次

frame.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent evt) {
        // 每次触发resize就重启计时器,相当于把待执行的逻辑往后推迟
        resizeTimer.restart();
    }
});

方案2:鼠标释放状态判断(仅适配鼠标拖拽调整场景,触发时机100%精准)

核心逻辑是通过标记位记录窗口是否处于调整中,只有当鼠标释放且之前发生过resize行为时,才执行目标逻辑:

// 标记位:是否有未处理的resize事件
boolean hasPendingResize = false;

frame.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent evt) {
        hasPendingResize = true;
    }
});

// 给窗口添加鼠标监听器,监听释放事件
frame.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent e) {
        if (hasPendingResize) {
            System.out.println("BLAH");
            // 这里写你调整结束后要执行的其他逻辑
            hasPendingResize = false;
        }
    }
});

如果你需要兼容键盘调整窗口大小的场景,建议选择方案1。

内容的提问来源于stack exchange,提问作者Alon_T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:36:04