Mega Code Archive

 
Categories / Java / Swing JFC
 

Ploygon Button

import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JApplet; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JToolTip; import javax.swing.Timer; public class PolygonButton extends JComponent implements MouseListener,     MouseMotionListener {   static public Color ACTIVE_COLOR = Color.red;   static public Color INACTIVE_COLOR = Color.darkGray;   protected String text;   protected Polygon polygon;   protected Rectangle rectangle;   protected boolean isActive;   protected static PolygonButton button;   public PolygonButton(Polygon p, String text) {     polygon = p;     setText(text);     setOpaque(false);     addMouseListener(this);     addMouseMotionListener(this);     rectangle = new Rectangle(polygon.getBounds()); // Bug alert!     rectangle.grow(1, 1);     setBounds(rectangle);     polygon.translate(-rectangle.x, -rectangle.y);   }   public void setText(String t) {     text = t;   }   public String getText() {     return text;   }   public void mouseMoved(MouseEvent e) {     if (!rectangle.contains(e.getX(), e.getY()) || e.isConsumed()) {       if (isActive) {         isActive = false;         repaint();       }       return; // quickly return, if outside our rectangle     }     int x = e.getX() - rectangle.x;     int y = e.getY() - rectangle.y;     boolean active = polygon.contains(x, y);     if (isActive != active)       setState(active);     if (active)       e.consume();   }   public void mouseDragged(MouseEvent e) {   }   protected void setState(boolean active) {     isActive = active;     repaint();     if (active) {       if (button != null)         button.setState(false);       setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));     } else {       button = null;       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));     }   }   public void mouseClicked(MouseEvent e) {   }   public void mousePressed(MouseEvent e) {   }   public void mouseReleased(MouseEvent e) {   }   public void mouseExited(MouseEvent e) {     mouseMoved(e);   }   public void mouseEntered(MouseEvent e) {     mouseMoved(e);   }   public void paint(Graphics g) {     g.setColor(isActive ? ACTIVE_COLOR : INACTIVE_COLOR);     g.drawPolygon(polygon);   }   public static void main(String[] argv) {     JFrame f = new JFrame();     f.setSize(400, 300);     Polygon p = new Polygon();     p.addPoint(10, 10);     p.addPoint(100, 300);     p.addPoint(300, 300);     p.addPoint(10, 10);     PolygonButton btn = new PolygonButton(p, "button");     f.getContentPane().add(btn);     WindowListener wndCloser = new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     };     f.addWindowListener(wndCloser);     f.setVisible(true);   } }