如何在鼠标释放时仅捕获一次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
相关产品推荐
相关产品推荐

