2012-12-09 148 views
4

在Swing中,有几种方法可以捕获最小化框架(图标化)的事件,但事件发生在框架为ICONIFIED时,意味着框架在屏幕上不可见之后。在JFrame最小化之前可以执行某些操作吗?

现在我想之前消失帧的运行一些代码- 立即当我点击任务栏按钮

换句话说,做一些事情时,JFrame的是“即将”(不是之后)最小化。是否有可能做到这一点?

+0

我(很)晚,但如果没有其他工作,这是很重要的,我会去自定义最小化/最大化/ /等未修饰的框架。纽扣。 顺便说一句,你是否尝试重写外观和感觉(我想它负责绘制这些按钮)并在那里使用自己的处理? – Matthieu

+0

我现在正在研究未修饰的框架解决方案,因为它似乎是唯一可行的路线,但是外观和感觉理念是我将在本周末探索的一条有趣路线。如果你可以把一个或多个样本放在一个可用的答案中,我可以给你赏金。 – glenneroo

回答

3

使用WindowStateListener,并调用WindowEvent#getNewState()和核对Frame.ICONIFIED

下面是一个例子:

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Frame; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public Test() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 300); 
      } 
     }; 

     frame.add(panel); 

     frame.addWindowStateListener(new WindowAdapter() { 
      @Override 
      public void windowStateChanged(WindowEvent we) { 
       if (we.getNewState() == Frame.ICONIFIED) { 
        System.out.println("Here"); 
       } 
      } 
     }); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 
+2

已在Mac OS X上验证过。 – trashgod

+1

它在Windows上也可以正常工作,但在窗口最小化后仍会捕获该事件。我会说对不起,我的问题可能不是那么容易理解,但是我试图强调的是,当窗口“即将被最小化”时,我能够抓住一些东西吗? – shuangwhywhy

+0

即使改变super.windowStateChanged(我们)和我的代码的位置,当窗口已经“ICONIFIED”时它仍然被捕获,我想要的是“ICONIFYING” - 就像“WINDOW_CLOSING”一样。 – shuangwhywhy

0

创建您自己的JFrame并覆盖setExtendedState方法。

public class MyFrame extends JFrame{ 

    .... 
    setExtendedState(JFrame.ICONIFIED); 
    .... 


@Override 
public void setExtendedState(int state) {  
    // your code 

    super.setExtendedState(state); 
    }; 

} 
+0

感谢Maxim,我已经重写了这个方法以及setState(),但是当我点击任务栏按钮时,框架就消失了,没有任何反应。 – shuangwhywhy

+0

@David,谢谢,但我怕框架被系统图标化时调用setState()和setExtendedState()吗? - 这是问题,实际上,我没有装饰JFrame,并附加了我自己调用setState()的自定义最小化按钮,并且它以这种方式正常工作,但如果单击任务栏中的最小化按钮,它就是另一个故事。 – shuangwhywhy

0

问题的回答“是否有可能之前JFrame的最小化,以执行一些动作?”

我会说不,不幸的是,我检查了openjdk(windows)的本地代码framewindow,它们将这些事件发送到java空间。据我所知,它是从Windows API VM_SIZE message回调。当“窗口已经最小化”并且在实际最小化之前没有得到任何消息时,发送SIZE_MINIMIZED

相关问题