2

swingx フレームワーク (http://swingx.java.net/) のデモを試してみました。メイン ウィンドウを閉じると、すばらしいフェード効果が得られます。JXFrame でこの効果を達成しようとしましたが、通常の終了効果しかありません。

誰にもアイデアがありますか?

4

1 に答える 1

1

ありがとう :-)

これは JXFrame とは関係なく (任意のウィンドウで実行できます)、ウィンドウの opacity プロパティにバインドされたタイムラインだけです。このタイムラインは、アプリケーション ウィンドウが閉じられたときに開始されます。関連するコードはDemoUtilsにあります。

public static void fadeOutAndDispose(final Window window,
        int fadeOutDuration) {
    fadeOutAndEnd(window, fadeOutDuration, false);
}

public static void fadeOutAndExit(Window window, int fadeOutDuration) {
    fadeOutAndEnd(window, fadeOutDuration, true);
}

private static void fadeOutAndEnd(final Window window, int fadeOutDuration, 
        final boolean exit) {
    Timeline dispose = new Timeline(new WindowFader(window));
    dispose.addPropertyToInterpolate("opacity", 1.0f,
            0.0f);
    dispose.addCallback(new UIThreadTimelineCallbackAdapter() {
        @Override
        public void onTimelineStateChanged(TimelineState oldState,
                TimelineState newState, float durationFraction,
                float timelinePosition) {
            if (newState == TimelineState.DONE) {
                if (exit) {
                    Runtime.getRuntime().exit(0);
                } else {
                    window.dispose();
                }
            }
        }
    });
    dispose.setDuration(fadeOutDuration);
    dispose.play();
}

public static class WindowFader {
    private Window window;

    public WindowFader(Window window) {
        this.window = window;
    }

    public void setOpacity(float opacity) {
        AWTUtilitiesWrapper.setWindowOpacity(window, opacity);
    }
}

装飾されていないウィンドウのみに影響を与えるように動作が変更されたため、jdk7 のすべてのフレームでフェード効果が機能しなくなったことに注意してください。

編集

Timeline (および callbackAdapter) は、Kirill のプロジェクトの 1 つである Trident のクラスであり、残念ながら彼によって放棄され、Insubstantial として引き継がれました (参照が手元にありません、申し訳ありません)。

于 2011-11-23T10:00:27.710 に答える