JInternalFrame激活/停用多次触发的事件

时间:2013-10-08 11:01:01

标签: java windows swing look-and-feel jinternalframe

在我的应用程序中,在JDesktopPane中我添加了几个JInternalFrame。 JInternalFrame的激活和取消激活正常发生,直到其中一个JInternalFrame最大化。之后,以编程方式激活内部框架,多次触发internalFrameActivated,internalFrameDeactivated事件。为何多次被召唤?我在WindowsLookAndFeel中仅观察到

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 个答案:

答案 0 :(得分: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);