Невозможно создать прозрачный и незадекларированный JFrame в JDK7 при включении nimbus

Посмотри на эту картинку : Прозрачный JFrame

вот код, который является прозрачным в кадре:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) { System.err.println( "Translucency is not supported"); System.exit(0); } JFrame.setDefaultLookAndFeelDecorated(true); 

это работает хорошо, но при попытке включить LookAndFeel путем добавления

  try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } }catch(.......) 

это дает мне эту ошибку

Исключение в streamе «AWT-EventQueue-0» java.awt.IllegalComponentStateException: рамка украшена

Что это за ошибка? и как его решить?

Спасибо за ваши ответы и предложения.

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

Заданный вопрос / CrossPosted

  • OTN

  • Daniweb

  • CodeRanch

  • принятый ответ by @JamesCherrill на Daniweb ,

  • Первый. Контейнер верхнего уровня, созданный на InitialThread, должен быть украшен и isDisplayable (), после чего возможно что угодно с остальной частью

  • Вероятно, требуется короткая задержка с помощью таймера Swing

,

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DemoWindows implements ActionListener { public static void main(String[] args) { // create a new demo, and update it every 50 mSec new Timer(30, new DemoWindows()).start(); } int phase = 0; // demo runs a number of consecutive phases int count = 0; // each of which takes a number of timesteps JFrame window1 = new JFrame("Java windows demo"); JLabel text1 = new JLabel("

Hello" + "
Everyone"); // "

This is a demo of some of the effects" // + "
that can be achieved with the new Java" // + "
transparent window methods

" // + "
(requires latest version of Java)"); JFrame window2 = new JFrame("Java windows demo"); JLabel text2 = new JLabel("
Java
rocks"); JButton button = new JButton("Whatever"); int w, h, r, x, y; // parameters of iris circle DemoWindows() { // build and diplay the windows window1.add(text1); window1.pack(); window1.setLocationRelativeTo(null); window1.setVisible(true); window2.setUndecorated(true); window2.setBackground(new Color(0, 0, 0, 0)); // alpha <1 = transparent window2.setOpacity(0.0f); text2.setFont(new Font("Arial", 1, 60)); text2.setForeground(Color.red); window2.add(text2); window2.add(button, BorderLayout.SOUTH); window2.pack(); window2.setLocationRelativeTo(null); window2.setVisible(true); // parameters of the smallest circle that encloses window2 // this is the starting pouint for the "iris out" effect w = window2.getWidth(); h = window2.getHeight(); r = (int) Math.sqrt(w * w + h * h) / 2; // radius x = w / 2 - r; // top left coordinates of circle y = h / 2 - r; } @Override public void actionPerformed(ActionEvent e) { try {// L&F changed on Runtime, repeatly fired from Swing Timer UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } catch (ClassNotFoundException ex) { Logger.getLogger(DemoWindows.class.getName()).log(Level.SEVERE, null, ex); } catch (InstantiationException ex) { Logger.getLogger(DemoWindows.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(DemoWindows.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(DemoWindows.class.getName()).log(Level.SEVERE, null, ex); } SwingUtilities.updateComponentTreeUI(window2); // called by timer 20 times per sec // goes thru a number of phases, each a few seconds long switch (phase) { case 0: { // initial pause if (++count > 50) { phase = 1; // go to next phase count = 0; } break; } case 1: { // fade in if (++count < 100) { window2.setOpacity(0.01f * count); } else { phase = 2; // go to next phase count = 0; } break; } case 2: { // move if (++count < 160) { if (count < 28 || count > 80) {// pause for best effect window2.setLocation(window2.getX() + 1, window2.getY() + 1); } } else { phase = 3; // go to next phase count = 0; } break; } case 3: {// iris out if (++count < r) { Shape shape = new Ellipse2D.Double( x + count, y + count, 2 * (r - count), 2 * (r - count)); window2.setShape(shape); } else { phase = 99; // go to final (exit) phase } break; } case 99: System.exit(0); } } }

Измените laf в основном методе, прежде чем ui будет создан @Sri Harsha Chilakapati

и @Sri Harsha Chilakapati Прошу прощения, но я вас не понял. Меня будут оценивать, если вы более подробно расскажете @Azad Omer

  • больше в учебнике Oracle. Изменение внешнего вида и ощущения ,

  • проблема вызвана кодовой строкой JFrame.setDefaultLookAndFeelDecorated(true); , необходимо отключить / прокомментировать эту строку кода //JFrame.setDefau...

  • по умолчанию нет проблем с созданием полупрозрачного JFrame с Nimbus L & F

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

от кода

 import java.awt.*; import javax.swing.*; public class TranslucentWindow extends JFrame { private static final long serialVersionUID = 1L; public TranslucentWindow() { super("Test translucent window"); setLayout(new FlowLayout()); add(new JButton("test")); add(new JCheckBox("test")); add(new JRadioButton("test")); add(new JProgressBar(0, 100)); JPanel panel = new JPanel() { @Override public Dimension getPreferredSize() { return new Dimension(400, 300); } private static final long serialVersionUID = 1L; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.red); g.fillRect(0, 0, getWidth(), getHeight()); } }; panel.add(new JLabel("Very long textxxxxxxxxxxxxxxxxxxxxx ")); add(panel); pack(); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { try { for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (Exception e) { e.printStackTrace(); } //JFrame.setDefaultLookAndFeelDecorated(true); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Window w = new TranslucentWindow(); w.setVisible(true); com.sun.awt.AWTUtilities.setWindowOpacity(w, 0.7f); } }); } } 

После некоторых исследований я выяснил, что проблема заключается в JDK7 и com.sun.awt.AWTUtilities , я думаю, что нам лучше не использовать пакеты com.sun кроме как в крайнем случае, поскольку они могут вызвать проблемы с обновлением версий JDK (они не являются частью JDK API).

Подробнее об этом читайте здесь.

От Oracle

Nimbus выглядел так же, как Swing, был представлен в JDK 6u10 в качестве замены старого Metal LoF. С JDK 7 Nimbus будет перенесен из собственного расширения Oracle (com.sun.java.swing) в стандартный API (javax.swing), чтобы он стал истинным гражданином Swing первого classа.

Кажется, что com.sun.awt.AWTUtilities отлично работает с JDK6 но Nimbus LAF находится в JDK7. Чем меньше я нахожу ответ на свой первый вопрос (что это за ошибка), а для второго вопроса (как его решить) я должен дождаться новой версии выпуска com.sun .

Я благодарен за усилия mKorbel , спасибо.

Interesting Posts

Как подключиться к базе данных Oracle 11. сеть

Как delete и deleteLater работает с сигналами и слотами в Qt?

Уведомления в определенное время каждый день

Как я могу использовать модуль Perl в каталоге, отличном от @INC?

Центр тяжести многоугольника

Как оживить элементы RecyclerView, когда они появляются

Загрузить файл свойств в Servlet / JSP

Когда происходит «запуск системы», если используется планировщик заданий с параметром / sc onstart?

Показывать число до двух знаков после запятой

Почему я получаю: «Ссылка на объект не установлена ​​на экземпляр объекта». Но не связана ли строка кода?

Параметр реестра для параметров просмотра совместимости IE для добавления сайта?

Как вы устанавливаете pythonbrew при использовании Fish Shell?

Как распределяется пул памяти Java?

Общий список – перемещение элемента в списке

Реализация загрузчика с использованием httpInterceptor и AngularJS 1.1.5

Давайте будем гением компьютера.