2013-10-08 28 views
0

在我的应用程序,在JDesktopPane中我加入了一些JInternalFrames。 JInternalFrames的激活和停用通常发生,直到JInternalFrame中的一个被最大化。之后,以编程方式激活内部框架,多次触发internalFrameActivated,internalFrameDeactivated事件。为什么被称为多次?这是我在WindowsLookAndFeel只有JInternalFrame的激活/停用事件发射多次

public class IFTest { 

public static void main(String[] args) { 
    try { 
     UIManager.setLookAndFeel(new WindowsLookAndFeel()); 
    } catch (UnsupportedLookAndFeelException e) { 
     e.printStackTrace(); 
    } 
    JFrame frame = new JFrame(); 
    JDesktopPane pane = new JDesktopPane(); 

    JInternalFrame if1 = new JInternalFrame("IF1"); 
    JInternalFrame if2 = new JInternalFrame("IF2"); 
    if1.setTitle("IF1"); 
    if2.setTitle("IF2"); 

    pane.add(if1); 
    pane.add(if2); 

    frame.getContentPane().add(pane); 
    frame.setSize(500, 500); 
    frame.setVisible(true); 

    if1.setMaximizable(true); 
    if1.setSize(400, 400); 
    showInternalFrame(if1); 
    if1.addInternalFrameListener(new MyInternalFrameListener("IF1")); 

    if2.setMaximizable(true); 
    if2.setSize(300, 300); 
    if2.setVisible(true); 
    showInternalFrame(if2); 
    if2.addInternalFrameListener(new MyInternalFrameListener("IF2")); 
    System.out.println("------------------------------"); 

    try { 
     if1.setMaximum(true); 
    } catch (PropertyVetoException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("--------------------------------"); 
    showInternalFrame(if2); 
} 

static class MyInternalFrameListener extends InternalFrameAdapter { 

    String name; 

    public MyInternalFrameListener(String name) { 
     this.name = name; 
    } 

    @Override 
    public void internalFrameActivated(InternalFrameEvent e) { 
     System.out.println(name + " activated"); 
    } 

    @Override 
    public void internalFrameIconified(InternalFrameEvent e) { 
     System.out.println(name + " iconfied"); 

    } 

    @Override 
    public void internalFrameDeactivated(InternalFrameEvent e) { 
     System.out.println(name + " deactivated"); 
    } 

    @Override 
    public void internalFrameDeiconified(InternalFrameEvent e) { 
     System.out.println(name + " deiconfied"); 
    } 
} 

public static void showInternalFrame(JInternalFrame intf) { 
    try { 
     if (intf.isIcon()) 
      intf.setIcon(false); 

     intf.setVisible(true); 
     intf.moveToFront(); 
     intf.setSelected(true); 
    } catch (PropertyVetoException ex) { 
     ex.printStackTrace(); 
    } 
} 
} 
+1

也许你是对的,为了更好的帮助越早张贴SSCCEm短,可运行,可编译到避免关于JInternalFrames事件的猜测 – mKorbel

+0

在windows下有一些有趣的桌面管理器实现行为。我们偷了默认的桌面管理器和更换它下的Windows外观 – MadProgrammer

+0

@MadProgrammer请这个答案OP或不:-) – mKorbel

回答

0

观察到它为什么叫多少次?

我猜测它不喜欢一次最大化多个帧。在正常的GUI中,您必须先恢复当前最大化的帧,然后才能点击另一帧来最大化它。

你的代码是:

if1.setMaximum(true); 
showInternalFrame(if2); 

我注意到,这段代码执行后,IF2是即使你没有明确要求其最大化最大化。所以我猜某处代码选择框它认识到当前帧最大化所以正在执行,恢复/停用帧一对夫妇的时间,直到IF1恢复并选择IF2的代码一堆并最大化。代码显然会产生一堆事件,因为它这样做。

在另一方面,如果你有这样的代码:

if1.setMaximum(true); 
if1.setMaximum(false); 
showInternalFrame(if2); 

那么你得到的事件如预期。

所以,也许是你的问题的解决方案,你可以添加代码,就像在你showInternalFrame()方法如下:

JinternalFrame active = intf.getDesktopPane().getSelectedFrame(); 

if (active.isMaximized()) 
    active.setMaximum(false); 

ints.setSelected(true);