Mega Code Archive

 
Categories / Java / Swing JFC
 

Customized component

import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.Customizer; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Calendar; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; public class Clock extends JButton implements Customizer, Externalizable,     Runnable {   protected PropertyChangeSupport propertyChangeSupport;   protected boolean isDigital = false;   protected Calendar calendar = Calendar.getInstance();   public Clock() {     propertyChangeSupport = new PropertyChangeSupport(this);     setBackground(Color.white);     setForeground(Color.black);     (new Thread(this)).start();   }   public void writeExternal(ObjectOutput out) throws IOException {     out.writeBoolean(isDigital);     out.writeObject(getBackground());     out.writeObject(getForeground());     out.writeObject(getPreferredSize());   }   public void readExternal(ObjectInput in) throws IOException,       ClassNotFoundException {     setDigital(in.readBoolean());     setBackground((Color) in.readObject());     setForeground((Color) in.readObject());     setPreferredSize((Dimension) in.readObject());   }   public Dimension getPreferredSize() {     return new Dimension(50, 50);   }   public Dimension getMinimumSize() {     return getPreferredSize();   }   public Dimension getMaximumSize() {     return getPreferredSize();   }   public void setDigital(boolean digital) {     propertyChangeSupport.firePropertyChange("digital", new Boolean(         isDigital), new Boolean(digital));     isDigital = digital;     repaint();   }   public boolean getDigital() {     return isDigital;   }   public void addPropertyChangeListener(PropertyChangeListener lst) {     if (propertyChangeSupport != null)       propertyChangeSupport.addPropertyChangeListener(lst);   }   public void removePropertyChangeListener(PropertyChangeListener lst) {     if (propertyChangeSupport != null)       propertyChangeSupport.removePropertyChangeListener(lst);   }   public void setObject(Object bean) {   }   public void paintComponent(Graphics g) {     super.paintComponent(g);     Color colorRetainer = g.getColor();     g.setColor(getBackground());     g.fillRect(0, 0, getWidth(), getHeight());     getBorder().paintBorder(this, g, 0, 0, getWidth(), getHeight());     calendar.setTime(new Date()); // get current time     int hrs = calendar.get(Calendar.HOUR_OF_DAY);     int min = calendar.get(Calendar.MINUTE);     g.setColor(getForeground());     if (isDigital) {       String time = "" + hrs + ":" + min;       g.setFont(getFont());       FontMetrics fm = g.getFontMetrics();       int y = (getHeight() + fm.getAscent()) / 2;       int x = (getWidth() - fm.stringWidth(time)) / 2;       g.drawString(time, x, y);     } else {       int x = getWidth() / 2;       int y = getHeight() / 2;       int rh = getHeight() / 4;       int rm = getHeight() / 3;       double ah = ((double) hrs + min / 60.0) / 6.0 * Math.PI;       double am = min / 30.0 * Math.PI;       g.drawLine(x, y, (int) (x + rh * Math.sin(ah)), (int) (y - rh           * Math.cos(ah)));       g.drawLine(x, y, (int) (x + rm * Math.sin(am)), (int) (y - rm           * Math.cos(am)));     }     g.setColor(colorRetainer);   }   public void run() {     while (true) {       repaint();       try {         Thread.sleep(30 * 1000);       } catch (InterruptedException ex) {         break;       }     }   }   public static void main(String[] a) {     JFrame f = new JFrame();     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     Clock c = new Clock();     f.getContentPane().add("Center", c);     f.pack();     f.setSize(new Dimension(300, 300));     f.show();   } }