2013-04-25 2 views
8

Посмотрите на эту картину: Transparent JFrame Может не прозрачны и неукрашенный JFrame в JDK7 при включении нимб

здесь код, который прозрачен это рама:

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(.......) 

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

Исключение в потоке "АВТ-EventQueue-0" java.awt.IllegalComponentStateException: Рама украшена

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

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

EDIT

Вопрос Задаваемые/CrossPosted

+2

Изменения LAF в основном методе, прежде чем пользовательский интерфейс создаются –

+0

'@Sri Harsha Chilakapati' Я извиняюсь, но я не получил вас, я буду признателен, если вы описать более – Azad

+0

Проблема заключается в том, что с вами настраивают внешний вид после включения прозрачности. Это дает исключение, поскольку у nimbus не было поддержки декорированных кадров. –

ответ

4
  • принял ответ на @JamesCherrill on Daniweb,

  • первым. Top-Level Контейнер создан на InitialThread должен быть оформлен и isDisplayable(), то после того, как можно все, что с остальными

  • problably требуется короткого затягивание качания Таймер

.

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("<HTML><H1>Hello" + "<BR>Everyone"); 
    // "<HTML><H1>This is a demo of some of the effects" 
    // + "<BR>that can be achieved with the new Java" 
    // + "<BR>transparent window methods</H1>" 
    // + "<BR>(requires latest version of Java)"); 
    JFrame window2 = new JFrame("Java windows demo"); 
    JLabel text2 = new JLabel("<HTML><center>Java<BR>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); 
     } 
    } 
} 
+2

@ Азад Омер, пожалуйста, чтобы увидеть [Java/Swing - > Создание уведомления JFrame и ошибка «Кадр отображается»] (http://stackoverflow.com/questions/16698699/java-swing-creating-a-notification-jframe-and-the-error- the-frame -is-disp/16699136 # 16699136), но все еще невозможно создать оформленное полупрозрачное окно и с измененным L & F – mKorbel

5

Изменение LAF в главном методе перед щ создается @Sri Harsha Chilakapati

и @Sri Harsha Chilakapati Я извиняюсь, но я не получил вас, я буду признателен, если вы опишете больше, @Azad Омер

  • больше в Oracle учебник Modifying the Look and Feel

    ,

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

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

enter image description here

из кода

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

Спасибо за ответ, но 'IllegalComponentStateException' сообщает мне, что кадр украшен. для информации: Я использую jdk1.7.0_15 и Netbeans 7.3 – Azad

+0

Проблема в этой строке 'AWTUtilities.setWindowOpacity (w, 0.2f);' – Azad

+0

aaach вы правы [ошибка для меня тоже] (http: // stackoverflow .com/a/7261603/714968), весь код, который работает для общедоступного AWTUtilities.setWindowOpacity(), не работает в Java7, включая undecorated container – mKorbel

3

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

Подробнее об этом вопросы Here

From Oracle

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^