2013-04-25 32 views
8

Spójrz na to zdjęcie: Transparent JFrame Może nie przejrzysty i bez dekoracji JFrame w JDK7 podczas włączania nimb

tutaj jest kod, który przezroczysty jest rama:

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

to działa dobrze, ale gdy próbuje włączyć LookAndFeel dodając

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

daje mi ten błąd

Wyjątek w wątku "AWT-EventQueue-0" java.awt.IllegalComponentStateException: Ramka jest ozdobione

Co to za błąd? i jak go rozwiązać?

Dzięki za odpowiedzi i sugestie.

EDIT

Pytanie zadawane/CrossPosted

+2

Zmiana LAF w głównej metodzie przed UI jest stworzony –

+0

'@Sri Harsha Chilakapati' przykro mi, ale nie będę cię być docenione, jeśli opisać bardziej – Azad

+0

Problem polega na tym, że od ciebie nadają wygląd po włączeniu przezroczystości. Daje wyjątek, ponieważ nimbus nie miał wsparcia dla dekorowanych ramek. –

Odpowiedz

4
  • akceptowane przez @JamesCherrill on Daniweb odpowiedź,

  • 1st. Top-Level Pojemnik stworzony na InitialThread musi być urządzone i isDisplayable(), to po co jest możliwe z resztą

  • problably wymaganym krótkim opóźniania przez Swing czasowy

.

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

@Azad Omer proszę zobaczyć [Java/Swing - > Tworzenie powiadomienia JFrame i błąd "Ramka jest wyświetlana"] (http://stackoverflow.com/questions/16698699/java-swing-creating-a-notification-jframe-and-the-error-the-frame -is-disp/16699136 # 16699136), ale wciąż nie można stworzyć dekorowanego półprzezroczystego okna ze zmienionym L & F – mKorbel

5

Zmiana LAF w głównej metodzie przed ui jest tworzony przez @Sri Harsha Chilakapati

i @Sri Harsha Chilakapati przykro mi, ale nie cię będę docenione, jeśli opisać więcej o @Azad Omer

  • więcej w Oracle tutorialu Modifying the Look and Feel,

  • problem jest spowodowany linii kodu JFrame.setDefaultLookAndFeelDecorated(true); wymagane, aby wyłączyć/Skomentuj ten kod linii //JFrame.setDefau...

  • domyślnie nie ma problemu, aby utworzyć półprzezroczyste JFrame z Nimbus L & F

enter image description here

z kodu

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

Dzięki za odpowiedź, ale 'IllegalComponentStateException' mówi mi, że ramka jest dekorowana. dla informacji: używam jdk1.7.0_15 i Netbeans 7.3 – Azad

+0

Problem jest w tym wierszu 'AWTUtilities.setWindowOpacity (w, 0.2f);' – Azad

+0

okaż, że masz rację [także dla mnie] (http: // stackoverflow .com/a/7261603/714968), cały kod działający dla publicznego AWTUtilities.setWindowOpacity(), nie działa w Javie7, w tym nieskonkretowany kontener – mKorbel

3

Po kilku badaniach dowiedziałem się, że problem występuje między JDK7 i com.sun.awt.AWTUtilities, myślę, że lepiej nie używać pakietów com.sun, chyba że w ostateczności, ponieważ mogą powodować problemy z aktualizacją wersji JDK (nie są one częścią interfejsu API JDK).

Czytaj więcej na ten temat wydaje Here

From Oracle

nimbus look-and-feel dla Swing został wprowadzony w JDK 6u10 jako zamiennik dla starego metalu opisu stanu faktycznego. W przypadku JDK 7 Nimbus zostanie przeniesiony z opatentowanego rozszerzenia Oracle (com.sun.java.swing) do standardowego interfejsu API (javax.swing), dzięki czemu stanie się prawdziwym obywatelem Swing pierwszej klasy.

Wydaje się com.sun.awt.AWTUtilities współpracuje z JDK6 ale Nimbus LAF jest w JDK7. Ills of less Znajduję odpowiedź na moje pierwsze pytanie (Co to za błąd), a na drugie pytanie (jak to rozwiązać) muszę poczekać do nowej wersji wydania com.sun.

Jestem wdzięczny za wysiłki mKorbel, dziękuję.