JButton personalizado

Boa tarde a todos
Parabéns pela iniciativa de manter este fórum, que tem um conteúdo de primeira, e a boa vontade de gente extremamente competente.

bom, eu preciso fazer, em Java, um menu lateral parecido com este:
http://www.inkscape.org/

Mas não imagino como fazê-lo, sem usar bitmaps para o texto, pois o label do botão deverá se modificar dinamicamente.
Não consigo usar um JButton com imagem de fundo e texto por cima desta imagem (creio que isso seja impossível). Também nao consigo mudar o background do botão e a cor do texto no estado Rollover deste botão.

Pergunto se alguém pode me ajudar, pois sou iniciante em Java.
Muito obrigado
feliz 2007 a todos

Você pode setar dinamicamente o fundo e a cor de um JButton dinamicamente, mas criar um gradiente (que não seja aquele gradiente chocho do Metal) já são outros quinhentos.
Para você pôr uma figura no fundo do JButton (em vez de pô-la ao lado) é necessário você derivar uma classe de JButton e sobrepôr paintComponent. Isso é meio chato (basta ver o fonte original de JButton).

Aham, se você limpar completamente o texto do JButton, e deixar as margens em 0,0,0,0, e atribuir corretamente os “icons” do JButton (existe para vários estados do botão) até dá para fazer só com “icons”. Acho que existe “icon”, “selectedIcon”, “disabledIcon”, etc. É bom ver a documentação.

Se voce é iniciante, vai ficar um pouco complicado… mas vou explicar…

Crie uma sub-classe de button, com um booleano under

Adicione um mouse listener a ela

[code] this.addMouseListener( new MouseListener() {
public void mouseEntered(java.awt.event.MouseEvent arg0) {
under = true;
repaint();
}

		public void mouseClicked(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mousePressed(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		public void mouseExited(MouseEvent arg0) {
			under = false;
			repaint();	
			
		};
	});[/code]

ate aqui, voce sabe qdo o mouse ta em cima do botao ou nao…

agora o mais dificil é sobreescrever o metodo paint…

vou dar um exemplo que eu fiz…

[code] public void paint(Graphics g) {
if (under)
g.setColor(Color.GRAY);
if (isSelected())
g.setColor(Color.LIGHT_GRAY);
if (!under && !isSelected())
g.setColor(Color.WHITE);

	Rectangle2D.Double square = new Rectangle2D.Double(0, 0, this.getSize()
			.getWidth(), this.getSize().getHeight());

	Graphics2D g2d = (Graphics2D) g;
	g2d.fill(square);
	
	g.setColor(Color.BLACK);
	g2d.draw(square);
	
	
		if (!under) {
			g.setColor(Color.BLACK);
			g2d.drawString(this.getText(), 5f, 15f);
			
		} else {
			g.setColor(Color.WHITE);
			g2d.drawString(this.getText(), 5f, 15f);
		}
			
}[/code]

voce pinta o fundo de acordo com o under…
use gradientes para conseguir akele efeito… o botao normal é apenas um retangulo cinza

espero ter ajudado!

Muito obrigado, thingol e felipecruz! Estou conseguindo graças a ajuda de vocês. Ainda falta muita unhada para o meu menu ficar pronto, mas quando eu terminar, eu posto o fonte aqui, ok?
[]

opa…

q bom que esta conseguindo

de uma olhada nos meus bookmarks sobre swing…
http://del.icio.us/felipecruz/swing

principalmente o blog do romain guy… muita coisa avançada!