Duvidas com JButton [Resolvido]

11 respostas
W
for(int i = 0;i < botao.length;i++)
        {
            final int j = i;
            botao[j].addActionListener
            (
                 new ActionListener()
                 {
                     @Override
                     public void actionPerformed(ActionEvent e)
                     {
                        botao[j].setText("X");
                        botao[j].setFont(new Font("Arial", Font.BOLD,70));
                     }
                 }
            );
            if(botao[i].getText().equals("X"))
                break;
        }

Pessoal, esse código esquisito é um teste que estou fazendo, pois na faculdade estamos aprendendo interface gráfica somente pelo NetBeans, arrastando e soltando componentes, então resolvi fazer por conta própria um jogo da velha utilizando componentes e containers e talz pra práticar, então fiz um array de JButton e em cada posição estou dando o valor “X”, só que o que eu queria e que depois que ele marcasse o botão com o X já saísse do laço de repetição, então tentei fazer o código acima, que infelizmente não deu certo…como eu faço pra testar se esse botão já foi clicado e consequentemente setado com o valor X??? Existe algum atributo que define se esse botão foi acionado ou não???

11 Respostas

walissongpi

Ainda não entendi o que você está tentando fazer…
Você está adicionando os eventos dentro de um laço de repetição, mas você quer parar ele quando acionar o evento? o.O

W

walissongpi:
Ainda não entendi o que você está tentando fazer…
Você está adicionando os eventos dentro de um laço de repetição, mas você quer parar ele quando acionar o evento? o.O

Sim, depois que clicar no botão quero informar ao laço que já pode sair, entendeu???

walissongpi

Wagner Junio:
walissongpi:
Ainda não entendi o que você está tentando fazer…
Você está adicionando os eventos dentro de um laço de repetição, mas você quer parar ele quando acionar o evento? o.O

Sim, depois que clicar no botão quero informar ao laço que já pode sair, entendeu???


Entendi, mas ainda está confuso.

Você vai representar o jogo da velha através de 9 botões, é isso?
Mas todos eles devem ter o evento adicionado a eles, certo?
Não entendo o porque de você querer interromper o laço de repetição…
Você deve adicionar a ação a todos os botões…

W

walissongpi:
Wagner Junio:
walissongpi:
Ainda não entendi o que você está tentando fazer…
Você está adicionando os eventos dentro de um laço de repetição, mas você quer parar ele quando acionar o evento? o.O

Sim, depois que clicar no botão quero informar ao laço que já pode sair, entendeu???


Entendi, mas ainda está confuso.

Você vai representar o jogo da velha através de 9 botões, é isso?
Mas todos eles devem ter o evento adicionado a eles, certo?
Não entendo o porque de você querer interromper o laço de repetição…
Você deve adicionar a ação a todos os botões…

Sim cara, mas acredite, eu tentei testar acionar o botao somente quando i for divisivel por 2 por exemplo marcando X e quando nao for marcando O, mas nao da certo tambem…entao a unica forma que achei foi fazer dois lacos interrompendo um e iniciando o outro, entendeu?

walissongpi

Poste seu código completo para eu dar uma olhada… :shock:

W
package damas.Telas;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public final class JanTabuleiro extends JFrame
{
    Container container;
    final JButton[] botao = new JButton[9];    
    
    public JanTabuleiro()
    {
        setTitle("Jogo da Velha");
        JMenuBar cxMenu = new JMenuBar();
        JMenu menuArquivo = new JMenu();
        JMenuItem itemSair = new JMenuItem();
        JTextField txtJogador1 = new JTextField();
        JLabel jlbJogador1 = new JLabel();
        JTextField txtJogador2 = new JTextField();
        JLabel jlbJogador2 = new JLabel();
        
        cxMenu.add(menuArquivo);
        menuArquivo.add(itemSair);
        
        cxMenu.setPreferredSize(new Dimension(350,25));
        menuArquivo.setText("Arquivo");
        menuArquivo.setPreferredSize(new Dimension(50,25));
        itemSair.setText("Sair");
        itemSair.setPreferredSize(new Dimension(50,25));
       
        txtJogador1.setPreferredSize(new Dimension(200,25));
        jlbJogador1.setPreferredSize(new Dimension(80,25));
        jlbJogador1.setText("Jogador 1: ");
        
        txtJogador2.setPreferredSize(new Dimension(200,25));
        jlbJogador2.setPreferredSize(new Dimension(80,25));
        jlbJogador2.setText("Jogador 2: ");   
        
        txtJogador1.setText(JOptionPane.showInputDialog("Digite o nome do primeiro jogador"));
        txtJogador2.setText(JOptionPane.showInputDialog("Digite o nome do segundo jogador"));
        txtJogador1.setEditable(false);
        txtJogador2.setEditable(false);
        
        container = getContentPane();
        container.setLayout(new FlowLayout(60));
        container.add(cxMenu);        
        container.add(jlbJogador1);
        container.add(txtJogador1);
        container.add(jlbJogador2);
        container.add(txtJogador2);
        defineBotoes();
        marcarBotoes();
        
        setSize(330,450);
        setVisible(true);
        setResizable(false);
    }
    public void defineBotoes()
    {
        
        for(int i = 0;i < botao.length;i++)
        {
            botao[i] = new JButton();
            botao[i].setPreferredSize(new Dimension(100,100));
            botao[i].setVisible(true);
            botao[i].setText("");
            container.add(botao[i]);
        }
    }
    private void marcarBotoes()
    {
        for(int i = 0;i < botao.length;i++)
        {
            final int j = i;

            botao[j].addActionListener
            (
                 new ActionListener()
                 {
                     @Override
                     public void actionPerformed(ActionEvent e)
                     {
                        botao[j].setText("X");
                        botao[j].setFont(new Font("Arial", Font.BOLD,70));
                     }
                 }
            );
        }        
    }
    public static void main(String[] args)
    {
	     JanTabuleiro jtab = new JanTabuleiro();
                
            jtab.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Tah aeh…num é aquela perfeição mas estou apenas praticando…hehehe

walissongpi

Só desabilitar o botão não é suficiente?

botao[j].setText("X"); botao[j].setFont(new Font("Arial", Font.BOLD,70)); botao[j].setEnabled(false); //aqui

só desabilitar o botão depois de clicado.
Outra opção seria você criar uma classe MeuBotão extends JButton e dentro dela você colocaria alguma variável pra poder identificar se já foi clicado.

W

walissongpi:
Só desabilitar o botão não é suficiente?

botao[j].setText("X"); botao[j].setFont(new Font("Arial", Font.BOLD,70)); botao[j].setEnabled(false); //aqui

só desabilitar o botão depois de clicado.
Outra opção seria você criar uma classe MeuBotão extends JButton e dentro dela você colocaria alguma variável pra poder identificar se já foi clicado.

A segunda ideia funcionou direitinho cara, valeu mesmo…
Agora uma dúvida um pouco mais avançada, eu queria fazer isso funcionar em rede entao criei uma conexao com postgresql e a cada clicada gravo a posicao, o valor e se acabou o jogo ou nao no banco de dados, so que so isso nao basta pois nao da pra eu acionar o comando em outro computador, entao criei um botao chamado atualizar, que a cada clicada o jogo vai no banco, pega os dados do outro jogador e atualiza em tempo real…por exemplo: pc1 joga, entao pc2 tem q atualizar para verificar a jogada de pc1 e vice versa…voce conhece alguma forma de atualizar esses dados em tempo real sem ter q clicar em um botao atualiza???

W

oi da uma olhda nesse codigo do jogo da velha aqui, acho que vai te ajudar bastante

package velha;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class JogoDaVelha extends JFrame implements ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public JButton[][] botoes = { { null, null, null }, { null, null, null },
			{ null, null, null } };
	public String jdv = "X";
	public JPanel p;
	public int control = 0, control_1 = 0;
	public int numLinhas = botoes[0].length;
	public int numColunas = numLinhas;
	public boolean acabou = false;
	public ActionEvent myEvent;
	public boolean empate = false;
	public JLabel od;
	public Container container;

	public JMenu jogo, ajuda;
	public JMenuItem novo, sair, sobre;
	public JMenuBar menu;

	public int contLV = 0, contCV = 0, indice = 0;
	public String vencedor = "";

	public JogoDaVelha() {
		container = this.getContentPane();

		setTitle("Jogo Da Velha");

		p = new JPanel();
		p.setLayout(new GridLayout(3, 3));

		od = new JLabel(new ImageIcon("OutDoor.jpeg"));
		container.add(od, BorderLayout.CENTER);

		Toolkit tk = Toolkit.getDefaultToolkit();
		setIconImage(tk.getImage("iconJDV.jpeg"));

		menu = new JMenuBar();

		jogo = new JMenu("Jogo");
		novo = new JMenuItem("Novo Jogo...");
		novo.addActionListener(this);
		jogo.add(novo);
		jogo.addSeparator();
		sair = new JMenuItem("Sair");
		sair.addActionListener(this);
		jogo.add(sair);

		ajuda = new JMenu("Ajuda");
		sobre = new JMenuItem("Sobre o Jogo da Velha Plus 0.1 - JVP");
		sobre.addActionListener(this);
		ajuda.add(sobre);

		menu.add(jogo);
		menu.add(ajuda);

		setJMenuBar(menu);

		for (int j = 0; j < numLinhas; j++) {
			for (int i = 0; i < botoes[j].length; i++) {
				botoes[j][i] = new JButton("");
				botoes[j][i].setBackground(Color.white);
				botoes[j][i].setFont(new Font("Times new Romam", Font.PLAIN,
						120));
				botoes[j][i].setToolTipText("Casa número: "
						+ String.valueOf(i + 1) + " da linha "
						+ String.valueOf(j + 1));
				botoes[j][i].addActionListener(this);
				p.add(botoes[j][i]);
			}
		}

		setBounds(250, 100, 560, 400);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
	}

	public void actionPerformed(ActionEvent e) {
		this.myEvent = e;

		if (e.getSource() == novo) {
			remove(od);
			setBounds(200, 50, 650, 550);
			container.add(p, BorderLayout.CENTER);
			acabou = false;
			limpar();
			setVisible(true);
		} else if (e.getSource() == sair) {
			System.exit(0);
		} else if (e.getSource() == sobre) {
			JOptionPane
					.showMessageDialog(
							null,
							"JOGO DA VELHA PLUS 0.1\n\nCopyright © 2005.1 - 2005.2 "
									+ "\nPowered by Wesllhey Holanda\nCONTATO\n"
									+ "E-Mail: [email removido]"
									+ "\nMSN: [email removido]\nHome - "
									+ "\nFone: 0 XX ([telefone removido]\n\nTodos os Direitos Reservados!!!",
							"[.:Sobre o JDV PLUS 0.1:.]",
							JOptionPane.INFORMATION_MESSAGE);
		} else {
			configJDV();
		}
	}

	public void configJDV() {
		int cont = 0;

		if (!acabou) {
			for (int i = 0; i < botoes.length; i++) {

				for (int j = 0; j < botoes[i].length; j++) {
					if (myEvent.getSource() == botoes[i][j]) {
						if (!botoes[i][j].getText().equals("")) {
							JOptionPane.showMessageDialog(this,
									"Jogue em outra posição...",
									"[.:POSIÇÃO JÁ OCUPADA!!!:.]",
									JOptionPane.ERROR_MESSAGE);
						} else {
							if (this.jdv == "X") {
								this.jdv = "0";
								botoes[i][j].setForeground(Color.blue);
							}

							else {
								this.jdv = "X";
								botoes[i][j].setForeground(Color.red);
							}

							botoes[i][j].setText(this.jdv);
							vencedor = this.jdv;
						}
					}
				}
			}

			/*********************************************************
			 * VERIFICA LINHAS
			 *********************************************************/

			if (
			
			botoes[0][0].getText().equals(botoes[0][1].getText())
					&& botoes[0][1].getText().equals(botoes[0][2].getText())
					&& !botoes[0][0].getText().equals("")) {
				pintarLinha(0, vencedor);
			}

			else if (
			botoes[1][0].getText().equals(botoes[1][1].getText())
					&& botoes[1][1].getText().equals(botoes[1][2].getText())
					&& !botoes[1][0].getText().equals("")) {
				pintarLinha(1, vencedor);
			}

			else if (
			botoes[2][0].getText().equals(botoes[2][1].getText())
					&& botoes[2][1].getText().equals(botoes[2][2].getText())
					&& !botoes[2][0].getText().equals("")) {
				pintarLinha(2, vencedor);
			}

			/*********************************************************
			 * VERIFICA LINHAS
			 *********************************************************/

			else if (
			botoes[0][0].getText().equals(botoes[1][0].getText())
					&& botoes[1][0].getText().equals(botoes[2][0].getText())
					&& !botoes[0][0].getText().equals("")) {
				pintarColuna(0, vencedor);
			}

			else if (
			botoes[0][1].getText().equals(botoes[1][1].getText())
					&& botoes[1][1].getText().equals(botoes[2][1].getText())
					&& !botoes[0][1].getText().equals("")) {
				pintarColuna(1, vencedor);
			}

			else if (
			botoes[0][2].getText().equals(botoes[1][2].getText())
					&& botoes[1][2].getText().equals(botoes[2][2].getText())
					&& !botoes[0][2].getText().equals("")) {
				pintarColuna(2, vencedor);

			} else if (
			botoes[0][0].getText().equals(botoes[1][1].getText())
					&& botoes[1][1].getText().equals(botoes[2][2].getText())
					&& !botoes[0][0].getText().equals("")) {
				pintarDiagonalPrinc();
			} else if (
			botoes[2][0].getText().equals(botoes[0][2].getText())
					&& botoes[0][2].getText().equals(botoes[1][1].getText())
					&& !botoes[2][0].getText().equals("")) {
				pintarDiagonalSec();

			} else {
				for (int i = 0; i < botoes.length; i++) {
					for (int j = 0; j < botoes.length; j++) {
						if (!botoes[i][j].getText().equals("")) {
							cont++;
						}
					}
					if (cont == 9) {
						empatar();
					}
				}
			}
		} else {
			JOptionPane.showMessageDialog(this, "[.:Reinicie o Jogo...:.]",
					"JOGO FINALIZADO!", JOptionPane.ERROR_MESSAGE);
		}
	}

	public void empatar() {
		this.acabou = true;

		for (int i = 0; i < botoes.length; i++) {
			for (int j = 0; j < botoes[i].length; j++) {
				botoes[i][j].setBackground(Color.black);
				botoes[i][j].setForeground(Color.gray);
			}
		}

		JOptionPane.showMessageDialog(this, "[.:Jogo Acabou empatado!:.]",
				"EMPATE", JOptionPane.WARNING_MESSAGE);
	}

	public void pintarLinha(int indice, String vencedor) {
		this.acabou = true;

		for (int i = 0; i < botoes[indice].length; i++) {
			botoes[indice][i].setBackground(Color.blue);
			botoes[indice][i].setForeground(Color.white);
		}

		parabéns();
	}

	public void pintarColuna(int indice, String vencedor) {
		this.acabou = true;

		for (int i = 0; i < botoes[indice].length; i++) {
			botoes[i][indice].setBackground(Color.blue);
			botoes[i][indice].setForeground(Color.white);
		}

		parabéns();
	}

	public void pintarDiagonalPrinc() {
		this.acabou = true;

		for (int i = 0; i < botoes.length; i++) {
			for (int j = 0; j < botoes[1].length; j++) {
				if (j == i && j == 1) {
					botoes[i - 1][j - 1].setBackground(Color.blue);
					botoes[i][j].setBackground(Color.blue);
					botoes[i + 1][j + 1].setBackground(Color.blue);
					botoes[i - 1][j - 1].setForeground(Color.white);
					botoes[i][j].setForeground(Color.white);
					botoes[i + 1][j + 1].setForeground(Color.white);
				}
			}
		}

		parabéns();

	}

	public void pintarDiagonalSec() {
		this.acabou = true;

		// Pinta a diagonal principal
		for (int i = 0; i < botoes.length; i++) {
			for (int j = 0; j < botoes[i].length; j++) {
				if (j == i && j == 1) {
					botoes[0][i * 2].setBackground(Color.blue);
					botoes[i * 2][0].setBackground(Color.blue);
					botoes[i][j].setBackground(Color.blue);
					botoes[0][i * 2].setForeground(Color.white);
					botoes[i * 2][0].setForeground(Color.white);
					botoes[i][j].setForeground(Color.white);
				}
			}
		}

		parabéns();
	}

	public boolean estáAcabado() {
		if (acabou)

			return acabou;
		else

			acabou = false;

		return acabou;
	}

	public void parabéns() {
		JOptionPane.showMessageDialog(this, vencedor + " Ganhou!",
				"[.:PARABÉNS:.]", JOptionPane.WARNING_MESSAGE);
	}

	public void limpar() {
		for (int i = 0; i < botoes.length; i++) {
			for (int j = 0; j < botoes[i].length; j++) {
				botoes[i][j].setText("");
				botoes[i][j].setBackground(Color.white);
			}
		}
	}

	public void setJDV() {
		if (this.control % 2 == 0) {
			this.jdv = "X";
		}

		else

			this.jdv = "0";
	}

	public static void main(String as[]) {
		new JogoDaVelha();
	}

}

espero ter ajudado!!!

InicianteJavaHenriqu

Wagner Junio:

…entao criei um botao chamado atualizar, que a cada clicada o jogo vai no banco, pega os dados do outro jogador e atualiza em tempo real…por exemplo: pc1 joga, entao pc2 tem q atualizar para verificar a jogada de pc1 e vice versa…voce conhece alguma forma de atualizar esses dados em tempo real sem ter q clicar em um botao atualiza???

Simples :smiley: basta você copiar o (método, função ou evento) que está no botão atualizar e colocar em cada um dos seus botões do jogo da velha.

W

InicianteJavaHenrique:
Wagner Junio:

…entao criei um botao chamado atualizar, que a cada clicada o jogo vai no banco, pega os dados do outro jogador e atualiza em tempo real…por exemplo: pc1 joga, entao pc2 tem q atualizar para verificar a jogada de pc1 e vice versa…voce conhece alguma forma de atualizar esses dados em tempo real sem ter q clicar em um botao atualiza???

Simples :smiley: basta você copiar o (método, função ou evento) que está no botão atualizar e colocar em cada um dos seus botões do jogo da velha.

Valeu, consegui fazer aqui…obrigado pela a ajuda :smiley:

Criado 20 de dezembro de 2011
Ultima resposta 28 de dez. de 2011
Respostas 11
Participantes 4