Является ли пример полупрозрачного окна обучающих программ по Java проблемой для тех, кто играет с jdk7? - PullRequest
9 голосов
/ 07 июня 2011

Вот пример .

Если вы соберете и запустите TranslucentWindow, скажем, в среде IDE NetBeans 7.0, которая поддерживает jdk7, вы получите следующее исключение:

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) для фрейма, тогда он не сгенерирует исключение и создаст полупрозрачное окно, хотя и без какого-либо украшения (что является болью).Это нормально?Разве этот код не должен работать прямо из коробки?Я что-то пропускаю?

РЕДАКТИРОВАТЬ

Почему их полупрозрачное окно выглядит украшенным, или это пользовательский рендеринг?

Что это ...

enter image description here

Что это должно быть ...

enter image description here

Ответы [ 5 ]

16 голосов
/ 07 июня 2011

Справа от JavaDocs для java.awt.frame.setOpacity () в JDK7 :

Чтобы установить значение непрозрачности меньше 1,0f, должны быть выполнены следующие условия:

  • Прозрачность полупрозрачности должна поддерживаться базовой системой
  • Окно должно быть неокрашенным (см. SetUndecorated (логическое) и Dialog.setUndecorated (логическое))
  • Окно не должно быть в полноэкранном режиме (см. GraphicsDevice.setFullScreenWindow (Window))

Если запрошенное значение непрозрачности меньше 1,0f и любое из вышеперечисленных условий не выполняется, непрозрачность окна не изменится и будет выдано исключение IllegalComponentStateException.

Поведение, которое вы видите, задокументировано и является ожидаемым поведением.

4 голосов
/ 31 августа 2011

Это подтвержденная ошибка.Я отправил информацию Oracle об ошибке своего примера кода, используя стандартную установку JDK 1.7.0 или JRE7.Используя приведенный ниже исходный код, скомпилированный в TranslucentWindow.java, он завершается неудачно и создает исключение, первоначально указанное выше.

С веб-страницы Страница прозрачности / формы Windows в Oracle

// 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)
2 голосов
/ 10 декабря 2011

Используйте com.sun.awt.AWTUtilities.setWindowOpacity(w, 0.5f) в JDK 7.

См. здесь .

0 голосов
/ 11 декабря 2015

Я думаю, вам нужно установить Undecorated перед setBackground, это решит проблему

0 голосов
/ 14 декабря 2011

Привет, проблема с этим кодом в том, что в методе 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, но я не думаю, что это возможно.

...