The Source for Java Technology Collaboration


-- Main.aberrant - 30 Jun 2008 This demo shows how implementing the RootPaneContainer? interface can create a component that has it's own glasspane.

JRootPanePanel - Wrapper comment that provides it's own glass pane.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class RootPaneDemo extends JPanel{

   private JToggleButton lockOuter = new JToggleButton("Overlay JFrame GlassPane");
   private JToggleButton lockInner = new JToggleButton("Overlay JRootPanePanel GlassPane");
   
   public RootPaneDemo() {
      
      setLayout(new BorderLayout());
      JRootPanePanel panel = new JRootPanePanel();
      panel.setGlassPane(new CustomGlassPane("Inner Glass Pane"));
      panel.setLayout(new BorderLayout());
      panel.add(new JTextField("1"), BorderLayout.NORTH);
      panel.add(new JScrollPane(new JTree()), BorderLayout.CENTER);
      panel.add(new JLabel("5"), BorderLayout.SOUTH);
      add(panel, BorderLayout.CENTER);
      
      JToolBar buttons = new JToolBar();
      buttons.add(lockOuter);
      lockOuter.addItemListener(new ToggleChange(this));
      
      buttons.add(lockInner);
      lockInner.addItemListener(new ToggleChange(panel));
      
      add(buttons, BorderLayout.SOUTH);
      
   }
   
   public static RootPaneContainer getRootPaneAncestor(Component c) {
        if (c instanceof RootPaneContainer) {
            return (RootPaneContainer)c;
        }
      
        for(Container p = c.getParent(); p != null; p = p.getParent()) {
            if (p instanceof RootPaneContainer) {
                return (RootPaneContainer)p;
            }
        }
        return null;
    }
   /**
    * @param args
    */
   public static void main(String[] args) {
       // turn bold fonts off in metal
         UIManager.put("swing.boldMetal", Boolean.FALSE);

         SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               JFrame demoFrame = new JFrame();
               demoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               demoFrame.setContentPane(new RootPaneDemo());
               demoFrame.setGlassPane(new CustomGlassPane("Outer GlassPane"));
               demoFrame.setSize(400, 400);
               demoFrame.setVisible(true);
            }
         });
   }

   private class ToggleChange implements ItemListener{

      private JComponent target;
      
      public ToggleChange(JComponent container) {
         target = container;
      }

      @Override
      public void itemStateChanged(ItemEvent e) {
         RootPaneContainer rpc = getRootPaneAncestor(target);
         JToggleButton tb = (JToggleButton) e.getSource();
         rpc.getGlassPane().setVisible(tb.isSelected());
      }
      
   };
   
   private static class CustomGlassPane extends JComponent{
      private static final Color shade = new Color(128,128,128,128);      
      
      public CustomGlassPane(String message){
         setLayout(new BorderLayout());
         setBackground(shade);
         JLabel messageLabel = new JLabel(message);
         messageLabel.setHorizontalAlignment(JLabel.CENTER);
         messageLabel.setForeground(Color.WHITE);
         messageLabel.setFont(messageLabel.getFont().deriveFont(Font.BOLD, 16));
         add(messageLabel);
      }
      public void paint(Graphics g) {
         g.setColor(shade);
         g.fillRect(0, 0, getWidth(), getHeight());
         super.paint(g);
      }
   }

}

Topic RootPaneDemo . { Edit | Ref-By | Printable | Diffs r1 | More }
 XML java.net RSS

Revision r1 - 30 Jun 2008 - 20:01:32 - Main.aberrant