==> BorderDecorator.java <==
import java.awt.*;
import java.awt.event.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;

public class SlashDecorator extends Decorator
{
   int x1, y1, w1, h1;

   public SlashDecorator(JComponent c)
   {
      super(c);
   }
   public void setBounds(int x, int y, int w, int h)
   {
      x1 = x; y1= y;
      w1 = w; h1 = h;
      super.setBounds(x, y, w, h);
   }
   public void paint(Graphics g)
   {
      super.paint(g);
      g.setColor(Color.red);
      g.drawLine(0, 0, w1, h1);
   }

}
==> CButton.java <==
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;
import com.sun.java.swing.tree.*;

public class CButton extends JButton
{
   private boolean mouse_over = false;
   CButton thisbutton;

   public CButton(String caption)
   {
      super(caption);
      thisbutton = this;
      addMouseListener(new MouseAdapter() 
      {
      public void mouseEntered(MouseEvent e) {mouse_over=true;thisbutton.repaint();}
      public void mouseExited(MouseEvent e) {mouse_over=false;thisbutton.repaint();}
      });

   }
   public void paint(Graphics g)
   {
      super.paint(g);
      if(! mouse_over)
      {
         Dimension size = getSize();
         g.setColor(Color.lightGray);
         g.drawRect(0, 0, size.width-1, size.height-1);
         g.drawLine(size.width-2, 0, size.width-2, size.height-1);
         g.drawLine(0, size.height-2, size.width-2, size.height-2);
      }
   }
}
==> CoolDecorator.java <==
import java.awt.*;
import java.awt.event.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;


public class CoolDecorator extends Decorator
{
   boolean mouse_over;    //true when mose over button
   JComponent thisComp;

   public CoolDecorator(JComponent c)
   {
      super(c);
      mouse_over = false;
      thisComp = this;      //save this component
      //catch mouse movements in inner class
      c.addMouseListener(new MouseAdapter() 
      {
      public void mouseEntered(MouseEvent e) {
         mouse_over=true;     //set flag when mouse over
         thisComp.repaint();
         }
      public void mouseExited(MouseEvent e) {
         mouse_over=false;    //clear flag when mouse not over
         thisComp.repaint();
         }
      });

   }
   //paint the button
   public void paint(Graphics g)
   {
      super.paint(g);      //first draw the parent button
      if(! mouse_over)
         //if the mouse is not over the button
         //erase the borders
      {
         Dimension size = super.getSize();
         g.setColor(Color.lightGray);
         g.drawRect(0, 0, size.width-1, size.height-1);
         g.drawLine(size.width-2, 0, size.width-2, size.height-1);
         g.drawLine(0, size.height-2, size.width-2, size.height-2);
      }

   }
}
==> Decorator.java <==
import java.awt.*;
import java.awt.event.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;


public class Decorator extends JComponent
{
   public Decorator(JComponent c)
   {
      setLayout(new BorderLayout());
      add("Center", c);
   }
}



==> JxFrame.java <==
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;


public class JxFrame extends JFrame
{
   public JxFrame(String title)
   {
      super(title);
      setCloseClick();
      setLF();
   }
   private void setCloseClick()
   {
      //create window listener to respond to window close click
      addWindowListener(new WindowAdapter() 
       {
	    public void windowClosing(WindowEvent e) {System.exit(0);}
	    });
   }
   //------------------------------------------
   private void setLF()
   {
   // Force SwingApp to come up in the System L&F
	String laf = UIManager.getSystemLookAndFeelClassName();
	try {
       UIManager.setLookAndFeel(laf);
   	 }
       catch (UnsupportedLookAndFeelException exc) 
         {System.err.println("Warning: UnsupportedLookAndFeel: " + laf);}
       catch (Exception exc) {System.err.println("Error loading " + laf + ": " + exc);
	   }
   }
}
==> SlashDecorator.java <==
import java.awt.*;
import java.awt.event.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;

public class SlashDecorator extends Decorator
{
   int x1, y1, w1, h1;

   public SlashDecorator(JComponent c)
   {
      super(c);
   }
   public void setBounds(int x, int y, int w, int h)
   {
      x1 = x; y1= y;
      w1 = w; h1 = h;
      super.setBounds(x, y, w, h);
   }
   public void paint(Graphics g)
   {
      super.paint(g);
      g.setColor(Color.red);
      g.drawLine(0, 0, w1, h1);
   }

}
==> borderWindow.java <==
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;
import com.sun.java.swing.border.*;


public class borderWindow extends JxFrame
   implements ActionListener
{
   JButton Quit, Cbutton, Dbutton;
   public borderWindow()
   {
      super ("Deco Button");
      JPanel jp = new JPanel();
      
      getContentPane().add(jp);
      jp.add( Cbutton = new JButton("Cbutton"));
      jp.add( Dbutton = new JButton("Dbutton"));
      EmptyBorder ep = new EmptyBorder(4,4,4,4);
      LineBorder lb = new LineBorder(Color.black, 2);
      Dbutton.setBorder(new CompoundBorder(lb, ep));
      jp.add(Quit = new JButton("Quit"));
      EtchedBorder eb = new EtchedBorder();
      Quit.addActionListener(this);
      Quit.setBorder(eb);
      setSize(new Dimension(200,100));
      
      setVisible(true);
      Quit.requestFocus();
   }
   public void actionPerformed(ActionEvent e)
   {
      System.exit(0);
   }
   static public void main(String argv[])
   {
      new borderWindow();
   }
}
==> decoWindow.java <==
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//swing classes
import com.sun.java.swing.text.*;
import com.sun.java.swing.*;
import com.sun.java.swing.event.*;


public class decoWindow extends JxFrame
   implements ActionListener
{
   JButton Quit;
   public decoWindow()
   {
      super ("Deco Button");
      JPanel jp = new JPanel();
      
      getContentPane().add(jp);
      jp.add( new CoolDecorator(new JButton("Cbutton")));
      jp.add( new SlashDecorator(new CoolDecorator(new JButton("Dbutton"))));
      //jp.add( new CoolDecorator(new JButton("Dbutton")));
      jp.add(Quit = new JButton("Quit"));
      Quit.addActionListener(this);
      setSize(new Dimension(200,100));
      
      setVisible(true);
      Quit.requestFocus();
   }
   public void actionPerformed(ActionEvent e)
   {
      System.exit(0);
   }
   static public void main(String argv[])
   {
      new decoWindow();
   }
}

