[RESOLVIDO] Pintar uma linha em um JButton

Olá. Estou fazendo um caça palavras em Java, e gostaria de saber como que eu posso pintar uma linha nesse JButton.

No caso, dependendo da posição da palavra (horizontal, vertical, diagonal), a linha ficaria em uma posição diferente. Ja procurei muito, mas não consegui achar nenhum exemplo assim, só mudando o bg do botão.

Obrigado.

uma sugestão:

Por que ao invés de tentar pintar uma linha você não seta a uma imagem?

jButton1.setIcon(new ImageIcon …

Porque a linha tem que ficar em cima do texto.

A idéia é que toda a palavra fique riscada, e por isso que a linha depende da posição da palavra.

amigo,

se sua palavra for JESUS

Vc faz no paint um J cortado na vertical ou horizontal…

um E cortado na vertical ou horizontal…

um S cortado na vertical ou horizontal…

um U cortado na vertical ou horizontal…

e salva a imagem,

depois chama a imagem no jbuton…

outro dia criei um dominó que seta imagens dentro de um jtable

criei todas as pedra no paint e chamei dentro do jtable…

creio que voce pode fazer a mesma coisa…

Então, na sua teoria, eu teria que fazer o seguinte:

Criar 1 letra sem linha
1 na vertical e 1 na horizontal
1 na diagonal pra baixo e um na diagonal pra cima.

São 5 imagens só pra uma letra

multiplicando isso pelas 26 letras do alfabeto, seriam 130 imagens.

Totalmente inviavel. Gostaria do jeito mais correto, que acho que seria fazer um drawLine, mas o que preciso saber é como usa-lo exatamente.

Você pode reimplementar o método paintComponent assim

[code]public class ButtonHorizontal extends JButton {

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);
}

}[/code]

Não daria para mudar o Background do JButton?

Voce só teria que fazer 4 imagens para as pontas e 2 para o meio das palavras (vertica e horizontal)…
As letras seriam o label do JButton…

dobau

Então velho, estou tentando fazer isso. O problema é que o x e o y sempre variam, por causa da posicao das palavras.

[code] private JButton riscarBotao(JButton botao, int posicao){
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;

    if(posicao == CacaPalavras.NORTE || posicao == CacaPalavras.SUL){
        x1 = (int) (botao.getSize().getWidth() / 2);
        x2 = x1;
        y2 = (int) botao.getSize().getHeight();
    }
    
    JButton botaoRiscado = new JButton(){
        @Override
        public void paint(Graphics g) {
            g.drawLine(x1, y1, x2, y2);
        }
    };
    
    return botaoRiscado;
}   [/code]

Ta dando um problema ai, porque não consigo acessar as variaveis x1, y1, x2 e y2 no metodo paint. Essa pra mim seria a solução ideal. Como eu posso acessar essas variaveis?

fernando

Poderia ser uma solução, mas o problema é que os botões variam de tamanho. Não tem como ter um tamanho padrao pra imagens.

Cria duas classes que extendam JButton, uma pode se chamar VerticalButton e outra HorizontalButton por exemplo, coloca aquele código que eu fiz para a horizontal e a veritical você faz o contrário, dependendo do tipo você instância ou uma ou outra classe, até porque você está criando um novo botão mesmo.

Lembra de implementar o método paintComponent e não o paint.

Fiz esse método aqui pra riscar o botao dependendo da posição dele. Por enquanto só fiz ele pra vertical, depois eu implemento o resto. O problema é que não está pintando a linha

[code] private void riscarBotao(JButton botao, int posicao){
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;

    if(posicao == CacaPalavras.NORTE || posicao == CacaPalavras.SUL){
        x1 = (int) (botao.getSize().getWidth() / 2);
        x2 = x1;
        y2 = (int) botao.getSize().getHeight();
    }
    
    final int x = x1;
    final int y = y1;
    final int w = x2;
    final int z = y2;
    
    botao = new JButton(){
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawLine(x, y, w, z);
        }
    };
    
    botao.updateUI();
}    [/code]

Alguém tem idéia de qual seja o problema?

[code]public class ButtonHorizontal extends JButton {

@Override  
protected void paintComponent(Graphics g) {  
    super.paintComponent(g);  


    // LEMBRA DE SETAR A COR DA LINHA
    g.setColor(Color.BLACK);



    g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);  
}  

}
[/code]

:slight_smile:

Lembra que teu botão pode crescer ou diminuir dependendo do layout que tu está utilizando, mas da forma que tu está implementando tua linha sempre teria o mesmo tamanho…

dobau.

Coloquei aqui o setColor, e não deu certo ainda :frowning:

E porque minha linha teria sempre o mesmo tamanho? Estou usando os x’s e y’s de acordo com o tamanho do meu botao.

Esse problema parece tão basico, mas enxe o saco --’

agora que reparei no seu código tu está instanciando um novo botão, sendo que tu está passando um outro botao como referencia… Esse é o problema, tu tem q desenhar a linha no botão e não na nova instância.

Eu implementaria assim, daí quando fosse para riscar botao eu chamaria botao.riscar( posicao );

[code]public class BotaoCacaPalavras extends JButton {

private boolean riscado = false;
private int posicao = 0;

public BotaoCacaPalavras(String text) {
    super(text);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    if (riscado) {
        g.setColor(Color.BLACK);

        // FAZ AQUI O CALCULO COM BASE NA POSICAO E PRONTO
        g.drawLine(0, this.getHeight()/2, this.getWidth(), this.getHeight()/2);
    }
}

public void riscar(int posicao) {
    this.posicao = posicao;
    this.riscado = true;
    this.repaint();
}

public void limpar() {
    this.riscado = false;
    this.repaint();
}

}[/code]

PS: Lembra que tu deve trocar a classe das palavras que antes eram JButton para BotaoCacaPalavras

Cara montei uma classe ai pra ti que extende JButton, mas com o recurso de traçar uma linha, tanto na horizontal quanto na vertical ou nas diagonais
acho que resolve o teu problema :wink:

Classe:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JButton;

public class JButtonTracing extends JButton {
	private static final long serialVersionUID = 1L;
	
	public static final int NONE = 0;
	public static final int HORIZONTAL = 1;
	public static final int VERTICAL = 2;
	public static final int CRESCENT = 3;
	public static final int DECRESCENT = 4;
	
	private int lineDirection;
	private Color lineColor;
	private Float stroke;
	
	public void scratch(int lineDirection){
		this.lineDirection = lineDirection;
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		Graphics2D g2d = (Graphics2D)g.create();
		g2d.setColor(lineColor!=null?lineColor:Color.black);
		if(stroke!=null)g2d.setStroke(new BasicStroke(stroke));
		
		switch (lineDirection) {
		case HORIZONTAL:{
			g2d.draw(new Line2D.Double(0, getHeight()/2, getWidth(), getHeight()/2));
			break;
		}case VERTICAL:{
			g2d.draw(new Line2D.Double(getWidth()/2, 0, getWidth()/2, getHeight()));
			break;
		}case CRESCENT:{
			g2d.draw(new Line2D.Double(0, getHeight(), getWidth(), 0));
			break;
		}case DECRESCENT:{
			g2d.draw(new Line2D.Double(0, 0, getWidth(), getHeight()));
			break;
		}default:
			break;
		}
		g2d.dispose();
	}
	
	public int getLineDirection() {
		return lineDirection;
	}
	public void setLineDirection(int lineDirection) {
		this.lineDirection = lineDirection;
	}
	public Color getLineColor() {
		return lineColor;
	}
	public void setLineColor(Color tracingColor) {
		this.lineColor = tracingColor;
	}
	public void setStroke(Float stroke) {
		this.stroke = stroke;
	}
	public Float getStroke() {
		return stroke;
	}
}

uma forma de utilizar:

JButtonTracing button = new JButtonTracing();
button.setBounds(10, 10, 200, 200);
getContentPane().add(button);
button.scratch(JButtonTracing.DECRESCENT);
button.setStroke(3F);
button.setLineColor(Color.orange);

o método “scratch” risca o botão, e vc passa por parâmetro a direção do tal risco
vc ainda pode setar a largura da linha e a cor dela com os métodos
setLineColor e setStroke

espero ter ajudado

:wink:

Margeu

PERFEITO CARA!! Funcionou perfeitamente! Muito obrigado!

Obrigado ao dobau também, me ajudou bastante aqui.

Agora vou estudar um pouco esse código aqui pra aprender melhor.