javaswinggraphicsglasspanejlayer

Secure Desktop Mode effect for java application


Does anyone now how to achieve a "Secure-Desktop Mode" (effect) such as one gets from the Windows Vista/7 UAC consent-blocks?

I assume it is some function which will remove pixels here-and-there (and possibly graying them) and then finally drawing that to screen. I would like to apply it to my application to keep the user from doing anything until another user connects to the system (but that is beside the point).

I would really appreciate the advice.

Kind regards,
A.

EDIT: I was really only looking for this

graphicsFX.setColor(new Color(0, 0, 0, 0.8f));
graphicsFX.fillRect(0, 0, 800, 600);

The deferring of input I can do quite well.

Thanks to all.


Solution

  • We use JXLayer for this exact purpose...

    enter image description hereenter image description here

    This is really useful as it locks the user out of the given container without locking the out of the application like a GlassPane solution does. It's like a glass pane for containers ;)

    I stole the basic idea for here

     public class JXLayerTest {
    
          public static void main(String[] args) {
               new JXLayerTest();
          }
    
          public JXLayerTest() {
               EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                         try {
                              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                         } catch (ClassNotFoundException ex) {
                         } catch (InstantiationException ex) {
                         } catch (IllegalAccessException ex) {
                         } catch (UnsupportedLookAndFeelException ex) {
                         }
    
                         final LockableUI ui = new LockableUI();
                         JPanel panel = new JPanel(new GridBagLayout());
                         buildUI(panel);
    
                         // This stolen directly from the JXLayer lockable blog                         
                         JXLayer layer = new JXLayer(panel, ui);
    
                         // Java2D grayScale BufferedImageOp
                         ColorConvertOp grayScale = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
                         // wrap it with the jxlayer's BufferedImageOpEffect 
                         BufferedImageOpEffect effect = new BufferedImageOpEffect(grayScale);
                         // set it as the locked effect        
                         ui.setLockedEffects(effect);
                         ui.setLocked(false);
    
                         JFrame frame = new JFrame();
                         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                         frame.setLayout(new BorderLayout());
                         frame.add(layer);
    
                         JPanel panelButtons = new JPanel(new GridBagLayout());
    
                         final JButton lock = new JButton("Lock");
                         lock.addActionListener(new ActionListener() {
                              @Override
                              public void actionPerformed(ActionEvent e) {
                                   boolean locked = !ui.isLocked();
                                   ui.setLocked(locked);
                                   lock.setText(locked ? "Unlock" : "Lock");
    
                              }
                         });
    
                         panelButtons.add(lock);
                         frame.add(panelButtons, BorderLayout.SOUTH);
    
                         frame.pack();
                         frame.setLocationRelativeTo(null);
                         frame.setVisible(true);
                    }
    
                    protected void buildUI(JPanel panel) {
                         GridBagConstraints gbc = new GridBagConstraints();
                         gbc.gridx = 0;
                         gbc.gridy = 0;
    
                         JLabel label = new JLabel();
                         try {
                              BufferedImage image = ImageIO.read(new File("megatokyo.png"));
                              label.setIcon(new ImageIcon(image));
                         } catch (IOException ex) {
                              label.setText("Nothing to see here");
                         }
    
                         panel.add(label, gbc);
    
                         JButton button = new JButton("Clickl me");
                         button.addActionListener(new ActionListener() {
                              @Override
                              public void actionPerformed(ActionEvent e) {
                                   JOptionPane.showMessageDialog(null, "Clicked");
                              }
                         });
    
                         gbc.gridy++;
                         panel.add(button, gbc);
    
                    }
               });
          }
     }