0

複数の JIF を開くアプリケーションがありますが、JIF のインスタンスを 1 つだけ作成したいので、これらの関数を使用して確認し、dispose を使用して、キーが押された後に JIF を閉じます (JDesktopPane.getSelectedFrame() 。廃棄())。しかし、2〜3回連続して破棄した後、新しいJIFが作成されませんか? 私はここで何か悪いことをしていますか?

public static void setInternalFrame(final JInternalFrame internalFrame) {
    log.debug("CurActiveInternalFrame " + ShoppyPOSApp.getCurrentActiveInternalFrame(), null);
    log.debug("Incoming internalFrame " + internalFrame, null);

    boolean isFrameFound = false;
    try {
        // Have a check whether the DesktopPane contains the internal Frame
        // If yes bring it to front and set the focus
        for (int i = 0; i < ShoppyPOSApp.frame.mainDesktopPane.getAllFrames().length; i++) {
            if (ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i].getClass() == internalFrame.getClass()) {
                isFrameFound = true;
            }
        }

        if (!isFrameFound) {
            internalFrame.setVisible(true);
            internalFrame.setLocation(
                ShoppyPOSApp.frame.mainDesktopPane.getWidth()/ 2 - internalFrame.getWidth() / 2,
                ShoppyPOSApp.frame.mainDesktopPane.getHeight() / 2 - internalFrame.getHeight() / 2
            );
            ShoppyPOSApp.frame.mainDesktopPane.add(internalFrame);
        }
        internalFrame.setSelected(true);
    } catch (Exception e) {
        log.debug(e.toString(), null);
    }
}
4

2 に答える 2

1

forループ内の入力パラメーターとデスクトップの内部フレームのクラスを比較しています。パラメータはJInternalFrameのインスタンスであり、getAllFramesメソッドはJInternalFramesの配列を返すため、これは常に当てはまります。定期的に比較してみませんか?:

ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame

フレームのデフォルトのクローズ操作HIDE_ON_CLOSEとして使用し、の代わりにキーリスナーで使用することをお勧めします。フレームが廃棄されると、それらは閉じられます。閉じられた後にフレームを再利用しようとしないでください。フレームを非表示にした場合でも、デスクトップペインの子になるため、メソッドでフレームを見つけたときに呼び出しを追加する必要があります。setVisible(false)dispose()setVisible(true)setInternalFrame

一貫性のない動作が発生しているようです(2、3回の破棄後に失敗すると言います)。これは、イベントスレッドに問題があることを示しています。setInternalFrameはイベントスレッドで呼び出されていますか?イベントディスパッチスレッドに精通していて、正しく使用していますか?

于 2009-11-17T22:10:12.273 に答える
1

私はdisposeあなたがそれをするためにあなたが意味することをしているとは思わない. disposeフレームのオペレーティング システム「ピア」を取り除きます。しかし、そのフレームを再び表示する場合は、その土台を捨ててはなりません。

setVisible(false)JIF を使用して非表示にします。その後、 で再アクティブ化できますsetVisible(true)

于 2009-11-15T06:48:50.877 に答える