3 Replies Latest reply: May 22, 2013 1:43 PM by mKorbel RSS

    Undecorated Translucent and Shaped Window in Java7

    mKorbel
      - Please how is possible (probably dirty hack) to create [How to Create Translucent and Shaped Windows](http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html)

      - undecorated container (returns java.awt.IllegalComponentStateException: The frame is displayable.)

      - change Look and Feel for (returns AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated)

      - by using code from linked official tutorial

      .
          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);
                  //setUndecorated(true);
              }
          
              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);
                      }
                  });
              }
          }
      - everything works for code compiled in JDK6xx, Top-level Container can be undecorated, LookAndFeel changed to Nimbus,

      - not for Java7 (doesn't matter if desicion platform, binnary souce is setted back to JDK6 or not)

      - original discusion on SO,[ Can't transparent and undecorated JFrame in JDK7 when enabling nimbus](http://stackoverflow.com/questions/16219111/cant-transparent-and-undecorated-jframe-in-jdk7-when-enabling-nimbus)

      - Asked/CrossPosted

      1. CodeRanch (http://www.coderanch.com/t/611044/GUI/java/Undecorated-Translucent-Shaped-Window-Java)

      2. Daniweb (http://www.daniweb.com/software-development/java/threads/454088/undecorated-translucent-and-shaped-window-in-java7)

      Edited by: mKorbel on 7.5.2013 10:29
        • 1. Re: Undecorated Translucent and Shaped Window in Java7
          mKorbel
          - accepted answer by @JamesCherrill on Daniweb,

          - 1st. Top-Level Container created on InitialThread must be decorated and isDisplayable(), then after is possible whatever with rest of

          - problably required short delaying by 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("<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. Re: Undecorated Translucent and Shaped Window in Java7
            Maxideon
            I think back in java 6, the translucent window stuff was an unofficial and unsupported feature. In beta testing so to speak. Now that they've made it official api in java 7, somewhere along the line they must of made a decision to only allow undecorated frames to be translucent.
            • 3. Re: Undecorated Translucent and Shaped Window in Java7
              mKorbel
              - half the solution in Java 7, is possible to create undecorated container, everything depends of proper ordering of methods

              - still not solution, possible to create decorated container and with changed Look And Feel

              .
                  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);
                          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                          setUndecorated(true);
                          pack();
                          setLocationRelativeTo(null);
                          setOpacity(0.70f);
                      }
                  
                      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);
                              }
                          });
                      }
                  }