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