The JLayer
class is a flexible and powerful decorator for Swing components, which enables you to implement various advanced painting effects as well as receive notifications of all AWTEvent
s generated within its borders. It enables you to draw on components and respond to component events without modifying the underlying component directly.
JLayer
is a good solution if you only need to do custom painting over compound component or catch input events from its subcomponents.
Software Requirement: Java Platform SE 7 (jdk1.7)
Here is a sample example,
//WallpaperLayerUI.java
class WallpaperLayerUI extends LayerUI<JComponent> { @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); Graphics2D g2 = (Graphics2D) g.create(); int w = c.getWidth(); int h = c.getHeight(); g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, .5f)); g2.setPaint(new GradientPaint(0, 0, Color.yellow, 0, h, Color.red)); g2.fillRect(0, 0, w, h); g2.dispose(); } }
//Wallpaper.java
import java.awt.*;import javax.swing.*;import javax.swing.plaf.LayerUI;public class Wallpaper {public static void main(String[] args) {javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() {createUI();}});}public static void createUI() {JFrame f = new JFrame("Wallpaper");JPanel panel = createPanel();LayerUI<JComponent> layerUI = new WallpaperLayerUI();JLayer<JComponent> jlayer = new JLayer<JComponent>(panel, layerUI);f.add (jlayer);f.setSize(300, 200);f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);f.setLocationRelativeTo (null);f.setVisible (true);}private static JPanel createPanel() {JPanel p = new JPanel();ButtonGroup entreeGroup = new ButtonGroup();JRadioButton radioButton;p.add(radioButton = new JRadioButton("Beef", true));entreeGroup.add(radioButton);p.add(radioButton = new JRadioButton("Chicken"));entreeGroup.add(radioButton);p.add(radioButton = new JRadioButton("Vegetable"));entreeGroup.add(radioButton);p.add(new JCheckBox("Ketchup"));p.add(new JCheckBox("Mustard"));p.add(new JCheckBox("Pickles"));p.add(new JLabel("Special requests:"));p.add(new JTextField(20));JButton orderButton = new JButton("Place Order");p.add(orderButton);return p;}}The output will be like below: