How can I create non-standart Buttons ?

I want my Button to be with a circular Shape for exampla or an oval and behave like a normal Button.Should I subclass java.awt.Component,java.awt.Canvas or java.awt.Button ? And what else should I do.I tried to overload tha paint method of the Button class but it didn't work.

10x fo the help

pdushanov@hotmail.com

[341 byte] By [pdushanov] at [2007-9-26 7:10:11]
# 1
Here is a JDC Tech Tip that explains how to do it: http://developer.java.sun.com/developer/TechTips/1999/tt0826.html#tip1
ashutosh at 2007-7-1 16:52:50 > top of Java-index,Desktop,Core GUI APIs...
# 2
I don't want to use Swing.That is the problem.Using swing makes the problem easy to solve ....
pdushanov at 2007-7-1 16:52:50 > top of Java-index,Desktop,Core GUI APIs...
# 3

Well, for AWT just extend Canvas. Of course, you need to get the Graphics context from whatever is supposed to be underneath the button so you can get the rectangular shape from that. The in your pain(), first put the image you got from the background. Then simply draw your polygon or whatever your button should be.

You will still have a solid rectangular Canvas but the area outside your shape and inside the edges of the canvas is exactly what is supposed to be behind it. So it would appear that it is an irregular shaped button.

ashutosh at 2007-7-1 16:52:50 > top of Java-index,Desktop,Core GUI APIs...
# 4

i don't do that often this is a source code

/**

* @author Borie Jean-Francois

* @version 1.01, 05/07/01

* @sinceJDK1.1

*/

import java.awt.Canvas;

import java.awt.Image;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Font;

import java.awt.Event;

import java.awt.Cursor;

import java.awt.Toolkit;

import java.awt.image.FilteredImageSource;

import java.awt.image.CropImageFilter;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.awt.event.MouseEvent;

import java.awt.event.KeyListener;

import java.awt.event.KeyEvent;

import java.awt.event.FocusListener;

import java.awt.event.FocusEvent;

public class ButtonCanvas extends Canvas

implements MouseListener, MouseMotionListener, KeyListener, FocusListener

{

private Image offScreenImage = null;

private Image ImgBackground = null;

private Image imgDown = null;

private Graphics _offScreen = null;

private String m_pText = new String("");

private Font font = new Font("Helvetica", Font.PLAIN, 10);

private int _x = 0;

private int _y = 0;

private int _width = 12;

private int _height = 12;

private boolean boolFocus = false;

private boolean boolDown = false;

private boolean boolRadioButton = false;

private Color down = new Color( 5, 213, 75 );

private boolean bimgup = false;

public ButtonCanvas(boolean flag)

{

boolRadioButton = flag;

addListener();

}

public ButtonCanvas(String str, boolean flag)

{

m_pText = str;

boolRadioButton = flag;

addListener();

}

public void setBounds(int x, int y, int w, int h)

{

super.setBounds(x, y, w, h);

_x = x;

_y = y;

_width = w;

_height = h;

offScreenImage = null;

_offScreen = null;

if(!bimgup)

ImgBackground = null;

repaint();

}

public void setSize(int w, int h)

{

super.setSize(w, h);

_width = w;

_height = h;

offScreenImage = null;

_offScreen = null;

if(!bimgup)

ImgBackground = null;

repaint();

}

public boolean getState()

{

return boolDown;

}

public void setState(boolean flag)

{

boolDown = flag;

repaint();

}

public void setIconDown(Image img)

{

imgDown = img;

}

public void setIconUp(Image img)

{

bimgup = true;

ImgBackground = img;

}

public void addListener()

{

this.addMouseListener(this);

this.addMouseMotionListener(this);

this.addKeyListener(this);

this.addFocusListener(this);

}

public void removeListener()

{

this.removeMouseListener(this);

this.removeMouseMotionListener(this);

this.removeKeyListener(this);

this.removeFocusListener(this);

}

public boolean isFocusTraversable()

{

return true;

}

public void focusGained(FocusEvent event)

{

boolFocus = true;

repaint();

}

public void focusLost(FocusEvent event)

{

boolFocus = false;

repaint();

}

public void mouseMoved(MouseEvent event )

{

this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

event.consume();

}

public void mousePressed(MouseEvent event )

{

if(boolRadioButton)

{

if(boolDown)

boolDown = false;

else

boolDown = true;

}

else

{

boolDown = true;

boolFocus = true;

}

repaint();

event.consume();

}

public void mouseDragged(MouseEvent event )

{

event.consume();

}

public void mouseEntered(MouseEvent event )

{

event.consume();

}

public void mouseClicked(MouseEvent event )

{

event.consume();

}

public void mouseReleased(MouseEvent event )

{

if(!boolRadioButton)

{

boolDown = false;

boolFocus = false;

}

repaint();

this.getParent().dispatchEvent(new MouseEvent(this,MouseEvent.MOUSE_RELEASED,event.getWhen(),event.getModifiers(),event.getX(),event.getY(),event.getClickCount(),false));

event.consume();

}

public void mouseExited(MouseEvent event )

{

this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

event.consume();

}

public void keyReleased(KeyEvent event)

{

switch(event.getKeyCode())

{

case KeyEvent.VK_ENTER :

case KeyEvent.VK_SPACE :

{

if(boolRadioButton)

{

if(boolDown)

boolDown = false;

else

boolDown = true;

this.getParent().dispatchEvent(new KeyEvent(this,KeyEvent.KEY_RELEASED,event.getWhen(),event.getModifiers(),event.getKeyCode(),event.getKeyChar()));

repaint();

}

else

{

this.getParent().dispatchEvent(new KeyEvent(this,KeyEvent.KEY_RELEASED,event.getWhen(),event.getModifiers(),event.getKeyCode(),event.getKeyChar()));

boolDown = false;

boolFocus = false;

}

}

default :

{

this.getParent().dispatchEvent(new KeyEvent(this,KeyEvent.KEY_RELEASED,event.getWhen(),event.getModifiers(),event.getKeyCode(),event.getKeyChar()));

break;

}

}

event.consume();

}

public void keyPressed(KeyEvent event)

{

if(!boolRadioButton)

{

boolDown = true;

boolFocus = true;

}

repaint();

event.consume();

}

public void keyTyped(KeyEvent event){}

private void paintBackground(Graphics g )

{

if(ImgBackground==null)

{

ButtonCanvasInterface parent = null;

while(this.getParent() instanceof ButtonCanvasInterface)

{

parent = (ButtonCanvasInterface)this.getParent();

if(!bimgup)

ImgBackground = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource( parent.getBackgroundAsImage().getSource() , new CropImageFilter( _x, _y, _width, _height)));

g.drawImage(ImgBackground, 0, 0, this);

break;

}

}

else

{

g.drawImage(ImgBackground, 0, 0, this);

}

}

public void paint(Graphics g )

{

if((_offScreen != null)&&(offScreenImage != null))

{

_offScreen.setPaintMode();

if(!boolRadioButton)

{

if(imgDown == null)

{

paintBackground(_offScreen);

}

else

{

if(!boolDown)

paintBackground(_offScreen);

else

_offScreen.drawImage( imgDown , 0, 0, this);

}

}

else

{

if(boolDown)

{

if(imgDown == null)

{

_offScreen.setColor(down);

_offScreen.fillRect(0,0, _width, _height);

_offScreen.setColor(Color.white);

_offScreen.setFont(font);

_offScreen.drawString(m_pText,2,_height-2);

}

else

_offScreen.drawImage( imgDown , 0, 0, this);

}

else

{

paintBackground(_offScreen);

_offScreen.setColor(Color.white);

_offScreen.setFont(font);

_offScreen.drawString(m_pText,2,_height-2);

}

if(imgDown == null)

if(boolFocus)

{

_offScreen.setColor(Color.yellow);

_offScreen.drawRect(0,0, _width-1, _height-1);

}

}

/*

_offScreen.setColor(Color.white);

_offScreen.drawRect(0,0,_width-1,_height-1);

*/

if(this.prepareImage( offScreenImage, _width, _height, this ));

g.drawImage( offScreenImage , 0, 0, this);

}

else

{

update(g);

}

g.dispose();

g.finalize();

return;

}

public void update(Graphics g)

{

if( offScreenImage == null)

offScreenImage = this.createImage( _width, _height );

if( _offScreen == null)

_offScreen = offScreenImage .getGraphics();

paint(g);

}

}

import java.awt.Image;

public interface ButtonCanvasInterface

{

public Image getBackgroundAsImage();

}

jef06 at 2007-7-1 16:52:50 > top of Java-index,Desktop,Core GUI APIs...