[RESOLVIDO] Pintar uma linha em um JButton

14 respostas
Arthur.hvt

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.

14 Respostas

SandroSoftwares

uma sugestão:

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

jButton1.setIcon(new ImageIcon

Arthur.hvt

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.

SandroSoftwares

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…

Arthur.hvt

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.

dobau

Você pode reimplementar o método paintComponent assim

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);
    }

}
fernandosavio

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…

Arthur.hvt

dobau

Então velho, estou tentando fazer isso. O problema é que o x e o y sempre variam, por causa da posicao das palavras.
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;
    }

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.

dobau

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.

Arthur.hvt
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
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();
    }

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

dobau
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);  
    }  
  
}

:)

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...

Arthur.hvt

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 --’

dobau

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 );

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();
    }

}

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

Margel_Douglas

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:

Arthur.hvt

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.

Criado 3 de junho de 2011
Ultima resposta 3 de jun. de 2011
Respostas 14
Participantes 5