1

私のアプリケーションでは、JDesktopPane にいくつかの JInternalFrames を追加しました。JInternalFrame のアクティブ化と非アクティブ化は、JInternalFrame の 1 つが最大化されるまで、正常に行われます。その後、内部フレームをプログラムでアクティブ化すると、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();
    }
}
}
4

1 に答える 1

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);
于 2013-10-08T16:33:10.367 に答える