This discussion is archived
3 Replies Latest reply: May 22, 2013 11:43 AM by mKorbel RSS

Undecorated Translucent and Shaped Window in Java7

mKorbel Explorer
Currently Being Moderated
- 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 Explorer
    Currently Being Moderated
    - 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 Explorer
    Currently Being Moderated
    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 Explorer
    Currently Being Moderated
    - 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);
                    }
                });
            }
        }

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points