启用nimbus时,JDK7中无法透明且未修饰的JFrame

看这张图片 : 透明的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(.......) 

它给了我这个错误

线程“AWT-EventQueue-0”中的exceptionjava.awt.IllegalComponentStateException:框架被修饰

这个错误是什么? 以及如何解决?

感谢您的回答和建议。

编辑

提问/ CrossPosted

  • OTN

  • Daniweb

  • CodeRanch

  • @JamesCherrill在Daniweb上接受了答案,

  • 1。 在InitialThread上创建的顶级容器必须进行修饰并且isDisplayable(),然后可以使用其余的

  • 可能需要通过Swing Timer进行短时间延迟

 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); } } }

在@Sri Harsha Chilakapati创建ui之前,更改main方法中的laf

和@Sri Harsha Chilakapati我很抱歉但是我没有得到你如果你对@Azad Omer的更多描述我将不胜感激

  • 更多Oracle教程修改外观 ,

  • 问题导致代码行JFrame.setDefaultLookAndFeelDecorated(true); ,需要禁用/注释此代码行//JFrame.setDefau...

  • 默认情况下,使用Nimbus L&F创建半透明JFrame没有问题

在此处输入图像描述

来自代码

 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); } }); } } 

经过一番研究后我发现问题出在JDK7com.sun.awt.AWTUtilities之间,我认为我们最好不要使用com.sun软件包,除非作为最后的手段,因为它们可能会导致升级JDK版本出现问题(它们不属于JDK API)。

阅读更多有关此问题的信息

来自Oracle

Swing的Nimbus外观在JDK 6u10中被引入,作为旧Metal LoF的替代品。 使用JDK 7,Nimbus将从Oracle专有扩展(com.sun.java.swing)转移到标准API(javax.swing),以便它成为真正的一流Swing公民。

它似乎是com.sun.awt.AWTUtilities适用于JDK6但Nimbus LAF在JDK7中。 我发现第一个问题的答案(这是什么错误),对于第二个问题(如何解决),我必须等到新版本的com.sun发布。

我很感谢mKorbel的努力,谢谢。