10

これがです。

TranslucentWindowたとえば、jdk7 をサポートする NetBeans IDE 7.0をビルドして実行すると、次の例外が発生します。

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
    at java.awt.Frame.setOpacity(Frame.java:960)
    at main.TranslucentWindow.<init>(TranslucentWindow.java:23)
    at main.TranslucentWindow$1.run(TranslucentWindow.java:47)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 1 second)

このスタック トレースによると、問題のある行はtw.setOpacity(0.55f). ただし、エラーが示すようsetUndecorated(true)に、フレームで呼び出すと、例外はスローされず、装飾はありませんが、半透明のウィンドウが作成されます (これは面倒です)。これは正常ですか?このコードは「そのまま」正しく実行されるべきではないでしょうか? 私は何かを見落としていますか?

編集

半透明のウィンドウが装飾されているように見えるのはなぜですか、それともこれはカスタム レンダリングですか?

それは何ですか...

ここに画像の説明を入力

どうあるべきか...

ここに画像の説明を入力

4

5 に答える 5

17

JDK7 の java.awt.frame.setOpacity() の JavaDocsから右:

不透明度の値を 1.0f 未満に設定するには、次の条件を満たす必要があります。

  • TRANSLUCENT 半透明性は、基盤となるシステムでサポートされている必要があります
  • ウィンドウは装飾されていない必要があります (setUndecorated(boolean) および Dialog.setUndecorated(boolean) を参照)。
  • ウィンドウはフルスクリーン モードであってはなりません (GraphicsDevice.setFullScreenWindow(Window) を参照)。

要求された不透明度の値が 1.0f 未満で、上記の条件のいずれも満たされない場合、ウィンドウの不透明度は変更されず、IllegalComponentStateException がスローされます。

表示されている動作は文書化されており、予期される動作です。

于 2011-06-06T23:51:31.250 に答える
4

これは確認済みのバグです。JDK1.7.0またはJRE7のデフォルトインストールを使用して失敗したサンプルコードに関するOracle情報を送信しました。TranslucentWindow.javaにコンパイルされた以下のソースコードを使用すると、失敗し、最初に上記で示した例外が生成されます。

WebページからOracleの半透明/シェイプされたWindowsページ

// Taken from http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#uniform 
import java.awt.*;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class TranslucentWindow extends JFrame {
public TranslucentWindow() {
    super("TranslucentWindow");
    setLayout(new GridBagLayout());

    setSize(300,200);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Add a sample button.
    add(new JButton("I am a Button"));
}

public static void main(String[] args)  {
        // Determine if the GraphicsDevice supports translucency.
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();

        //If translucent windows aren't supported, exit.
        if (!gd.isWindowTranslucencySupported(TRANSLUCENT))
    {
        System.err.println("Translucency is not supported");
        System.exit(0);
    }

    // Create the GUI on the event-dispatching thread
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            TranslucentWindow tw = new TranslucentWindow();
            // Set the window to 55% opaque (45% translucent).
            tw.setOpacity(0.55f);
            // Display the window.
            tw.setVisible(true);
        }
    });
}

}

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
    at java.awt.Frame.setOpacity(Frame.java:960)
    at TranslucentWindow$1.run(TranslucentWindow.java:38)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
于 2011-08-31T18:25:45.667 に答える
2

setBackground の前に setUndecorated を設定する必要があると思います。これで問題が解決します

于 2015-12-11T17:52:30.527 に答える
2

com.sun.awt.AWTUtilities.setWindowOpacity(w, 0.5f)JDK 7 で使用します。

ここを参照してください。

于 2011-12-09T21:33:53.303 に答える
0

こんにちは、このコードの問題は、main() メソッドに次のコード行がないことです。

JFrame.setDefaultLookAndFeelDecorated(true);

半透明のウィンドウがサポートされていないかどうかを確認して終了するコードの直後に配置する必要があります。

    //If translucent windows aren't supported, exit.
    if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) {
        System.err.println(
            "Translucency is not supported");
            System.exit(0);
    }

    JFrame.setDefaultLookAndFeelDecorated(true);

    // Create the GUI on the event-dispatching thread
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            TranslucentWindow tw = new TranslucentWindow();

            // Set the window to 55% opaque (45% translucent).
            tw.setOpacity(0.55f);

            // Display the window.
            tw.setVisible(true);
        }
    });

また、Java のルック アンド フィールを使用しているため、均一な半透明のイメージは誤解を招きます。代わりに、イメージは Windows システムのルック アンド フィールを使用する必要があります (Windows を使用していると仮定します)。Java ルック アンド フィール (つまりJFrame.setDefaultLookAndFeelDecorated(false);) を使用しようとすると、以前と同じエラーがスローされます。半透明のウィンドウが Java のルック アンド フィールで機能することを期待していましたが、これは不可能だと思います。

于 2011-12-14T05:19:04.980 に答える