Является ли пример полупрозрачного окна Java Tutorials проблемой для тех, кто играет с jdk7?

Вот пример.

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

ИЗМЕНИТЬ

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

Что это такое...

введите здесь описание изображения

Каким он должен быть...

введите здесь описание изображения


person mre    schedule 06.06.2011    source источник
comment
Та же ошибка: NetBeans 7, Java 7, Windows 7: 777   -  person toto2    schedule 07.06.2011
comment
Похоже инструкция устарела...   -  person kleopatra    schedule 09.09.2011


Ответы (5)


Прямо из JavaDocs для java.awt.frame.setOpacity () в JDK7:

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

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

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

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

person Thomas Owens    schedule 06.06.2011
comment
@Томас, ну! :( ... хорошо, что это в Javadoc! :) - person mre; 07.06.2011
comment
К сожалению, у меня очень мало опыта работы с JDK7. Я только начал изучать его только потому, что NetBeans 7 поддерживает его. Я ковырялся минут 20. - person Thomas Owens; 07.06.2011
comment
@Томас, аналогично. это просто оказалось одним из первых предметов, на которые я обратил внимание. оцените помощь до сих пор. :) - person mre; 07.06.2011
comment
Единственные три вещи, о которых я могу думать: (1) это «магазин», (2) по какой-то причине ограничение на неукрашенные окна не всегда было, и это было зафиксировано до того, как это было на месте, или (3) вы можете установите декорированную спинку после того, как сделаете окно полупрозрачным. Но я бы не стал ставить деньги ни на одного из них... Хотел бы я помочь больше. - person Thomas Owens; 07.06.2011
comment
@ Томас, мое первое предположение было (1), но (2) также звучит разумно, ха-ха ... просто жаль, что они ложно рекламируют ...: / для меня неукрашенные окна гораздо менее привлекательны. - person mre; 07.06.2011
comment
неудачное изменение поведения - ломает существующие приложения :-( - person kleopatra; 09.09.2011
comment
появляется из заголовка stackoverflow.com/questions/7353799/, что, если вы используете внешний вид Java, у вас все еще может быть строка заголовка. эй. - person rogerdpack; 14.09.2011

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

С веб-страницы Oracle Translucency/Shaped Windows Page

// 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)
person Rick Hodgin    schedule 31.08.2011
comment
Где отчет об ошибке, чтобы другие могли его увидеть? Я заметил, что с jre6 я иногда получаю это исключение, а в других случаях он показывает полную полупрозрачность JFrame (как это должно быть в его примере). iteye.com/topic/1113045, кажется, подразумевает ошибку в jdk6, которая была разрешена , а также stackoverflow.com/ вопросы/4631021/ - person rogerdpack; 08.09.2011
comment
Это был не официальный отчет об ошибке в их системе отчетов об ошибках, а электронное письмо сопровождающим страницы документации о том, что на этой странице есть ошибочный код. Я так и не получил от них ответа, но электронное письмо было отправлено на адрес [email protected]. - person Rick Hodgin; 13.09.2011
comment
Официального отчета об ошибке нет, и тем не менее вы называете это подтвержденной ошибкой?? - person b1nary.atr0phy; 27.08.2012
comment
да. Это воспроизводимо. Это очевидно. Это отличается от опубликованного поведения. Он также появился в версии 1.7.0 в соответствии с новыми требованиями к кодированию прозрачности. Тот же код в 1.6.x работает нормально. - person Rick Hodgin; 29.08.2012
comment
Я думаю, что это все еще работает, если вы сначала вызываете setUndecorated(true) или setDefaultLookAndFeelDecorated(true). Что странно, поскольку в jdk6 этого не требовалось. Похоже, вы можете воспроизвести старое поведение, см. docs.oracle. com/javase/tutorial/uiswing/misc/ для параметров jdk7. Но хреново он изменился... - person rogerdpack; 05.09.2013

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

См. здесь.

person Sujith Themath    schedule 09.12.2011

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

person Benjemaa    schedule 11.12.2015

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

person kimbaudi    schedule 14.12.2011
comment
JFrame.setDefaultLookAndFeelDecorated(false); ничего не исправляет. - person b1nary.atr0phy; 27.08.2012
comment
для меня установка JFrame.setDefaultLookAndFeelDecorated(true) позволяет избежать конкретной рассматриваемой ошибки (обязательно сделайте это перед созданием фрейма, см. docs.oracle.com/javase/6/docs/api/javax/swing/ - person rogerdpack; 05.09.2013
comment
JFrame.setDefaultLookAndFeelDecorated(true) и JDialog.setDefaultLookAndFeelDecorated(true) работают только с некоторыми LookAndFeels. Например, WindowsLookAndFeel, похоже, не использует эти свойства. - person Adrodoc55; 15.02.2016