5

私は今問題を抱えていframe.setState(Frame.ICONIFIED)ます.カスタムボタンを呼び出すと(デフォルトのJFrame最小化ボタンを使用していません.JFrameをに設定していますsetUndecorated(true))、JFrameはアニメーションなしでタスクバーに移動します. 通常の状況では、タスクバーが徐々に最小化されます。しかし、タスクバーでアイコン化された JFrame を押すと、アニメーションとともに通常のサイズに戻ります。状況は Windows XP であり、他のシステムではテストされていませんが、同じように動作すると思います。

4

3 に答える 3

4

プラットフォームに依存しないようにしたいので、私の他の答えはうまくいきません。また、ウィンドウを最小化または非表示にしたときの反応は、プラットフォームごとに異なります。あなたは、一貫したアニメーションを提供する Java コード フラグメントが見られるとよいと述べました。ここにいくつかのコードがあります。

import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;

public class FadeUtilityClass
{
    private static final int TIME = 200;
    private static final int MILLIS_PER_FRAME = 33;
    private static final float DELTA = MILLIS_PER_FRAME / (float)TIME; //how much the opacity will change on each tick

    /**
     * @param frame the frame to fade in or out
     * @param in true if you are fading in, false if you're fading out
     */
    public static void fade(final JFrame frame, final boolean in)
    {
        frame.setOpacity(in ? 0f : 1f); //if we're fading in, make sure our opacity is 0, and 1 if we're fading out
        if (in) //set the state back to normal because we might have been minimized
            frame.setState(JFrame.NORMAL); 
        final Timer timer = new Timer();
        TimerTask timerTask = new TimerTask()
        {
            float opacity = in ? 0f : 1f;
            float delta = in ? DELTA : -DELTA;

            @Override
            public void run()
            {
                opacity += delta; //tweak the opacity
                if (opacity < 0) //we're invisible now
                {
                    frame.setState(JFrame.ICONIFIED); //hide frame
                    frame.setOpacity(1f); //then make it opaque again, so it'll reappear properly if they click the taskbar 
                    timer.cancel(); //stop the timer
                }
                else if (opacity > 1) //we're fully visible now
                {
                    frame.setOpacity(1f); //make the opacity an even 1.0f
                    timer.cancel(); //stop the timer
                }
                else
                    frame.setOpacity(opacity);
            }
        };
        timer.scheduleAtFixedRate(timerTask, MILLIS_PER_FRAME, MILLIS_PER_FRAME);
    }
}

これは、装飾されていないフレームをフェードインまたはフェードアウトさせるユーティリティ クラスです。タスクバーと最小化されたウィンドウの場所はプラットフォームに基づいて変化し、それを見つけるにはプラットフォーム固有の API を使用する必要があるため、タスクバーがある場所までウィンドウを縮小せずに、アニメーションでウィンドウをフェードアウトさせました。

お役に立てれば!

于 2013-08-30T23:25:10.660 に答える
3

あなたが言っていることが真実であり、タスクバーのアイコンをクリックすると、装飾されていないウィンドウが実際にアニメーション化される場合. 次に、JNA を使用してコード内で同じアクションをトリガーできます。

このソリューションを機能させるには、クラスパスにjna.jarjna-platform.jarを含める必要があります。

これは JNA のチュートリアルではありません。たくさんのチュートリアルがあります。これは、JNA を使用して user32.dll 関数のCloseWindowおよびOpenIconを呼び出す単なるコードです。これらは、アプリケーションのトレイ アイコンをクリックしたときに Windows が呼び出す関数です

import java.awt.Component;
import java.awt.Window;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;

public class IconifyUtilityClass
{
    public static void minimize(Window window)
    {
        HWND hWnd = getHWND(window);
        User32dll.INSTANCE.CloseWindow(hWnd); //call CloseWindow with this windows handle
    }

    public static void restore(Window window)
    {
        HWND hWnd = getHWND(window);
        User32dll.INSTANCE.OpenIcon(hWnd); //call OpenIcon with this windows handle
    }

    private interface User32dll extends Library
    {
        User32dll INSTANCE = (User32dll) Native.loadLibrary("user32.dll", User32dll.class);
        boolean OpenIcon(HWND hWnd);
        boolean CloseWindow(HWND hWnd);
    }

    private static HWND getHWND(Component comp)
    {
        return new HWND(Native.getComponentPointer(comp));
    }
}

コードを呼び出すには、フレームまたはダイアログを次のように渡すだけです

JFrame frame = new JFrame();
...
IconifyUtilityClass.minimize(frame); //minimize your frame
...
IconifyUtilityClass.restore(frame); //restore your frame

Windows 7 では、装飾されていないフレームはまったくアニメーション化されないことに注意してください (user32.dll AnimateWindow関数を使用しても)。したがって、フレームをどこでもアニメーション化することが目標である場合は、その通りです。自分で行う必要があります。JavaFx には、これに役立つ非常に優れたアニメーション機能がいくつかあります。

于 2013-08-29T22:41:04.993 に答える
2

呼び出すことによって

myJFrame.setUndecorated( true )

JFrame のフレーム装飾を無効にしています。これには、JFrame の最大化と最小化に関するアニメーションが含まれます。

この通話をスキップするか、

myJFrame.setUndecorated( false )

を呼び出してフレームを最小化しても、アニメーションは再び表示されます。

myJFrame.setState( Frame.ICONIFIED );

私の知る限り、装飾されていないフレームをアニメーション化する方法はありません。:(

ここで私の完全なコードサンプルを見つけてください:

    JFrame frame = new JFrame();
    frame.setSize( 800, 600 );
    frame.setUndecorated( false );  // will enable animations
    frame.setVisible( true );
    try { Thread.sleep( 3000 ); } catch ( Throwable t ) {}
    frame.setState( Frame.ICONIFIED );

ご挨拶

クリストファー

于 2013-08-29T08:05:14.600 に答える