import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.beans.*; import java.io.*; /** * A Three State Button Class * @author Noman Naeem * @version 1.0 */ public class ThreeStateButtonBean extends JComponent implements Serializable{ private int state = 0; private int x = 0; private int y = 0; private int height = 30; private int width = 30; private final int MIN_WIDTH = 10; private final int MIN_HEIGHT = 10; private final int RAISED_OFFSET = -1; private transient PropertyChangeSupport pcs = new PropertyChangeSupport(this); private boolean isDown = false; private transient java.util.Vector actionListeners; private boolean hasFocus = false; public ThreeStateButtonBean() { this.setOpaque(true); this.enableEvents(AWTEvent.MOUSE_EVENT_MASK); this.enableEvents(AWTEvent.KEY_EVENT_MASK); this.enableEvents(AWTEvent.FOCUS_EVENT_MASK); actionListeners = new java.util.Vector(); } public void processMouseEvent(MouseEvent me) { switch (me.getID()) { case MouseEvent.MOUSE_PRESSED: isDown = true; this.requestFocus(); repaint(); break; case MouseEvent.MOUSE_RELEASED: isDown = false; int s = (state+1)%3; setState(s); if (actionListeners.size() > 0) { ActionEvent ae = new ActionEvent(this,me.getID(),"Mouse Clicked on Button"); this.fireActionEvent(ae); } break; } super.processMouseEvent(me); } public void processKeyEvent(KeyEvent ke) { switch (ke.getID()) { case KeyEvent.KEY_PRESSED: if (ke.getKeyChar() == ' ') { isDown = true; repaint(); } break; case KeyEvent.KEY_RELEASED: if (ke.getKeyChar() == ' ') { isDown = false; int s = (state+1)%3; setState(s); if (actionListeners.size() > 0) { ActionEvent ae = new ActionEvent(this,ke.getID(),"Space Pressed on Button"); this.fireActionEvent(ae); } } break; } super.processKeyEvent(ke); } public void processFocusEvent(FocusEvent fe) { switch (fe.getID()) { case FocusEvent.FOCUS_GAINED: hasFocus = true; repaint(); break; case FocusEvent.FOCUS_LOST: hasFocus = false; repaint(); break; } } public synchronized void addPropertyChangeListener(PropertyChangeListener pl) { pcs.addPropertyChangeListener(pl); } public synchronized void addActionListener(ActionListener al) { actionListeners.addElement(al); } public synchronized void removeActionListener(ActionListener al) { actionListeners.removeElement(al); } public synchronized void removePropertyChangeListener(PropertyChangeListener pl) { pcs.removePropertyChangeListener(pl); } public boolean isFocusTraversable() { return true; } public void fireActionEvent(ActionEvent ae) { java.util.Vector actionListenersClone; synchronized (this) { actionListenersClone = (java.util.Vector)actionListeners.clone(); } for (int i=0;i<actionListenersClone.size();i++) ((ActionListener)actionListenersClone.elementAt(i)).actionPerformed(ae); } public void setState(int state) { PropertyChangeEvent pce = new PropertyChangeEvent(this,"state",new Integer(this.state),new Integer(state)); pcs.firePropertyChange(pce); this.state = state; this.repaint(); } public int getState() { return state; } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(getBackground()); g2.fillRect(x,y,width,height); if (!isDown) { if (hasFocus) { g2.draw3DRect(x+1,y+1,width-2,height-2,true); } else { javax.swing.border.Border cb = BorderFactory.createEtchedBorder(); cb.paintBorder(this,g,x,y,width,height); } } else { g2.setColor(new Color(160,160,160)); g2.fillRect(x,y,width,height); g2.setColor(Color.white); g2.drawRect(x,y,width-1,height-1); g2.setColor(new Color(100,100,100)); g2.drawRect(x,y,width-2,height-2); } if (state == 1) { g2.setStroke(new BasicStroke(width/MIN_WIDTH)); x = width/16; g2.setColor(Color.black); g2.drawLine(x+width/5+x/2,y+height/2+height/12,x+width/3,y+height-height/3); g2.drawLine(x+width/3,y+height-height/3,x+width-width/3,y+height/3); x = 0; } else if (state == 2) { if (!hasFocus) x = RAISED_OFFSET; g2.setStroke(new BasicStroke(width/MIN_WIDTH)); g2.setColor(Color.black); g2.drawLine(x+width/3,y+height/3,x+width-width/3,y+height-height/3); g2.drawLine(x+width-width/3,y+height/3,x+width/3,y+height-height/3); x = 0; } } public int getHeight() { return height; } public void setHeight(int height) { if (height > MIN_HEIGHT) { setPreferredSize(new Dimension(width,height)); } } public int getWidth() { return width; } public void setWidth(int width) { if (width > MIN_WIDTH) { setPreferredSize(new Dimension(width,height)); } } public Dimension getPreferredSize() { return new Dimension(width, height); } public void setPreferredSize(Dimension d) { super.setPreferredSize(d); this.height = d.height; this.width = d.width; revalidate(); if (this.getParent() != null) this.getParent().repaint(); } private void writeObject(ObjectOutputStream oos) throws IOException { oos.defaultWriteObject(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); actionListeners = new java.util.Vector(); pcs = new PropertyChangeSupport(this); } }
Sunday, April 11, 2010
How to create a ThreeStateButton in java
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment