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.
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]
[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]
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…
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
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;
}
}
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