Pulsanti personalizzati

Combinando quanto visto finora si può facilmente creare dei pulsanti personalizzati, per esempio:


Andare sopra con il mouse, premere, uscire.

Con l'aggiunta di un MouseListener, questo pulsante risponde agli eventi.

Il codice dell'applet è:

import java.applet.*;
import java.awt.*;


public class Es_OvalButt extends Applet{
	
	OvalButt b1;	
	
public void init(){
setBackground(Color.white);
b1 = new OvalButt(90,90,"Rotondo","Times",15,new Color(150,200,250),new Color(200,0,0));
add(b1);
	}

}

L'applet usa la classe OvalButt il cui codice è:

import java.awt.*;
import java.awt.event.*;

class OvalButt extends Canvas implements MouseListener{

int w,h,l,fontsize,tx, ty;
Color bg, fg;
String txt, fonttype;
int stato;

//costruttore

OvalButt(int w, int h, String txt, String fonttype, int fontsize,Color bg, Color fg){
	this.w = w;
	this.h = h;
	this.txt = txt;
	this.fonttype = fonttype;
	this.fontsize = fontsize;
	this.bg = bg;
	this.fg = fg;
	setSize(w,h);
	addMouseListener(this);
	stato = 0;
	repaint();
	}



public void update(Graphics g){
	paint(g);
	}
public void paint(Graphics g){
	//bg del canvas
	g.setColor(getBackground());
	g.fillRect(0,0,w-1,h-1);
	//bouton
	g.setColor(bg);
	g.fillOval(0,0,w-1,h-1);
	//texte
	if(stato == 0){ g.setFont(new Font(fonttype, Font.BOLD,fontsize));}
	else{ g.setFont(new Font(fonttype, Font.PLAIN, fontsize-3));}
	int l = (g.getFontMetrics()).stringWidth(txt);
	int yh = (g.getFontMetrics()).getHeight();
	int yd = (g.getFontMetrics()).getDescent();
	tx = (w - l)/2;
	ty = (h + yh)/2 - yd -1;
	g.setColor(Color.white);
	g.drawString(txt,tx+1,ty+1);
	g.setColor(fg);
	g.drawString(txt, tx, ty);
	//bordi
	if(stato == 0){
	g.setColor(Color.white);
	g.drawOval(1,1,w-2,h-2);
	g.setColor(Color.black);
	g.drawOval(0,0,w-2,h-2);
	}
	else if(stato == -1){
	g.setColor(Color.white);
	g.drawOval(1,1,w-2,h-2);
	g.setColor(Color.lightGray);
	g.drawOval(0,0,w-2,h-2);
}
else if(stato == 1){
	Color wcol = new Color(230,230,230);
	g.setColor(wcol);
	g.drawOval(1,1,w-2,h-2);
	Color lG = new Color(50,50,50);
	g.setColor(lG);
	g.drawOval(0,0,w-2,h-2);
	}
}

public void mousePressed(MouseEvent e){
	stato = -1;
	repaint();
	}

public void mouseReleased(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

public void mouseEntered(MouseEvent e){
	stato = 1;
	repaint();
	}
public void mouseExited(MouseEvent e){
	stato = 0;
	repaint();
	}

//dimensioni

public Dimension getMinimumSize(){
	return new Dimension(w,h);
}

public Dimension getPreferredSize(){
	return new Dimension(w,h);
	}
}//fine classe

Chiaramente le possibili variazioni sul tema sono praticamente infinite, ognuno deve sperimentare le proprie!

PS: Dimenticavo, ci sono anche le animazioni con i threads, ma questo è un'altra storia...
Per ora, velocemente: per la prima applet, si ridisegnano i puntini con un colore (quasi) casuale, il colore viene cambiato nel metodo run() del thread:

public void run() {
Thread thisThread = Thread.currentThread();
while(runner == thisThread){
colore = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
repaint();
try {
    Thread.sleep(1000);
} catch(InterruptedException e) { }
}
}
Per il codice completo della seconda applet, seguire questo link.
Invece, il codice della terza applet si trova qui.


pg 1	pg 2		pg 3		pg 4