Problema com JButton

9 respostas
Boster

Bom dia galera, ai vai a jaca que eu to tentando resolver, sou iniciante meeesmo,
agradeço mto se alguem ai puder me ajudar.
Um quebra costela a todos.

a declaração da matriz botao eh a seguinte:

private	JButton	[][] botao = new JButton[9][9];

E sempre que meu código cham esta função:

public void	limpa_matriz(){

			for(int	line = 0; line < botao.length; line++){
				for(int	coln = 0; coln < botao.length; coln++){
					if(!(botao[line][coln].getText().equals(" "))){
						for(int	line1 =	0; line1 < botao.length; line1++){
							for(int	coln1 =	0; coln1 < botao.length; coln1++){
								if (line != line1 && coln != coln1){
									if(!(botao[line1][coln1].getText().equals("	"))){
										String x = (botao[line][coln].getName());
										String y = (botao[line1][coln1].getName());
										if( x.equals(y)){
											botao[line][coln].setText("	");
										}								
									}
								}		
							}   
						}
					}
				}
			}

	}

ele retorna esta mensagem:

Li que este erro deve-se ao fato de que estou tentando ler uma posição nula, mas não sei como tratar esse erro e conseguir ler as posições sem problemas.

9 Respostas

F

o que vc ta tentando fazer?

Felagund

isso acontece pq em um determinano momente vc não tem um botão dentro do teu array
ou seja nessa posição ele é null

se vc fizer uma chamada null.setText("") = NullPointer

Boster

É o seguinte to programando um sudoku.
Eu gero valores aleatórios para criar uma matriz inicial do sudoku, ai chamo essa função para verificar se existe números repetidos na linha e na coluna (ainda não verifico o quadrante menor), ex.: no botao[4][5] eu tenho o numero 2, ai eu verifico se na linha 4 existe repetição do numero 2 e na coluna 5 existe repetição do número 2, se existe,
eu pego essa posição e coloco '" ".

M

voce adiciona os botões dentro da matriz em outro lugar?

Boster

Não. Eu só manipulo ela.

vou colocar o código completo aqui embaixo.

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.lang.String;

public class Sudoku	extends	JFrame implements ActionListener{
	/*Declaração de	atributos da classe*/
	private	JButton	[][] botao = new JButton[9][9];
	private	int	[] novo	= new int[100];
//	private	int	[] novo_aux	= new int[15];
	private	JFrame win = new JFrame("Sudoku");
	private	JPanel [] painel = new JPanel[9];
	
	private	JMenuBar barra = new JMenuBar();
	private	JMenu menu1	= new JMenu("Opçoes");
	private	JMenuItem item1	= new JMenuItem("Novo Jogo");
	private	JMenuItem item2	= new JMenuItem("Sobre...");
	private	JMenuItem item3	= new JMenuItem("Sair");
	/*Construtor da	Classe ele faz os botoes e a janela*/		
	public Sudoku(){
		fazBotao();
		fazJanela();
		novoJogo();
		limpa_matriz();
	}
	/*Metodo que faz o meno	da Barra de	Menu*/
	public JMenuBar	menu(){
		item1.addActionListener(this);
		menu1.add(item1);
		item2.addActionListener(this);
		menu1.add(item2);
		item3.addActionListener(this);
		menu1.add(item3);
		barra.add(menu1);
		return barra;
	}
	/*Metodo que faz os	botoes*/
	public void	fazBotao(){
		for(int	i =	0; i < botao.length; i++){
			painel[i] =	new	JPanel(new GridLayout(3,3));
			painel[i].setBorder(BorderFactory.createLineBorder(Color.BLACK,	1));
			for(int	j =	0; j < botao.length; j++){
				botao[i][j]	= new JButton();
				botao[i][j].setText(" ");
				botao[i][j].addActionListener(this);
			painel[i].add(botao[i][j]);
			}
		}
	}
	/*Metodo que faz as	janelas*/
	public void	fazJanela(){
		win.setJMenuBar(menu());
		win.getContentPane().setLayout(new GridLayout(3,3));
		win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		for(int	i =	0; i < painel.length; i++){ 
			win.getContentPane().add(painel[i]);
		}
		//win.pack();
		win.setSize(390,350);
		win.setDefaultLookAndFeelDecorated(false);
		win.setResizable(false);
		win.setVisible(true);   
	}
	


	public void	limpa_matriz(){
	int loop = 0;
		while( loop < 10){
			for(int	line = 0; line < botao.length; line++){
				for(int	coln = 0; coln < botao.length; coln++){
					for(int	line1 =	0; line1 < botao.length; line1++){
						for(int	coln1 =	0; coln1 < botao.length; coln1++){
							if(!(botao[line][coln].getText().equals(" "))){
								if(!(botao[line1][coln1].getText().equals("	"))){
									String x = (botao[line][coln].getName());
									String y = (botao[line1][coln1].getName());
									if( x.equals(y)){
										botao[line][coln].setText("	");
									}								
								}		
							}   
						}
					}
				}
			}
		loop = loop + 1;
		}
	}
	
	
	/*Metodo que inicia	um novo	Jogo*/
	
	public void	novoJogo(){
		int	lin, col;
		boolean	val;
		
		for(int	i =	0; i < novo.length;	i++){
			
			novo[i]	= (int)	(1 + (Math.random()	* 9)); 
		//	novo_aux[i]	= (int)(numero);
		}
		
		for(int	i =	0; i < botao.length; i++){
			for(int	j =	0; j < botao.length; j++){
				botao[i][j].setText(" ");
			}
		}
		
		for(int	i =	0; i < novo.length;	i++){
			lin	= (int)	(Math.random() * 9);
			col	= (int)	(Math.random() * 9);

			for(int	coluna = 0;	coluna < botao.length; coluna++){
				if (!(botao[lin][coluna].getText().equals("	"))	&& botao[lin][coluna].getText().compareTo(Integer.toString(novo[i])) ==	0 ){
					novo[i]	= 99;
				}				
			}

			for(int	linha =	0; linha < botao.length; linha++){
				if (!(botao[linha][col].getText().equals(" ")) && botao[linha][col].getText().compareTo(Integer.toString(novo[i])) == 0 ){
					novo[i]	= 99;
				}				
			}
			
			if (novo[i]	!= 99){
				botao[lin][col].setText(String.valueOf(novo[i]));
			}
		}

		limpa_matriz();

	}			
	/*Metodo que gerencia os Eventos da	Classe*/
	public void	actionPerformed(ActionEvent	e){
		String n = " ";
		int	nro;
		
		/*No menu Novo Jogo*/
		if(e.getSource() ==	item1){
			novoJogo();
			limpa_matriz();
		}
		/*No menu Sobre...*/
		if(e.getSource() ==	item2){
			JOptionPane.showMessageDialog(null,	"Sudoku!!! \n" +
												"Inteligência Artificial I \n" +
												"Desenvolvedor:" +
												"\nAlker Barni RA. 986956","Sobre Sudoku", JOptionPane.WARNING_MESSAGE);
		}
		/*No menu Sair*/
		if(e.getSource() ==	item3){
			System.exit(0);
		}
		/*Aqui eu vou gerenciar	os eventos de cada botao do	Array*/
		for(int	i =	0; i < botao.length; i++){
			for(int	j =	0; j < botao.length; j++){
				if(e.getSource() ==	botao[i][j]){
					do{	/*loop de integridade de dado*/
						nro	= Integer.parseInt(JOptionPane.showInputDialog(null, "Digite o numero",	"Sudoku", JOptionPane.WARNING_MESSAGE));
						if(nro <= 0	|| nro > 9){
							JOptionPane.showMessageDialog(null,	"Numero	Inválido", "Sudoku Notifica", JOptionPane.WARNING_MESSAGE);
						}
					}while(nro <= 0	|| nro > 9);/*Fim do loop*/
					n =	n.valueOf(nro);
					botao[i][j].setText(n);
					if(e.getSource() ==	botao[i][j]){
						break;
					}
				}
			}
		}
		/*Fim dos Eventos*/
		
	}
	/*Metodo Principal Chamando	o Construtor*/
	public static void main(String args[]){
		new	Sudoku();
	}
}

Lembrando que eu estou reutilizando este código de um usuário aqui do forum e estou adaptando a lógica do jogo.

71C4700

Cara ja que vc vai trabalhar com uma Tabela de valores, porque nao utiliza visualmente uma JTable?

Seria melhor de controlar ate mesmo os eventos…

Vou colocar uma joguinho que fiz utilizando-a, num ta bom mas ja é alguma coisa…

Boster

Vou conferir assim que chegar me casa. =)
Eh q nao manjo de java neh, to fazendo e aprendendo.
Não sei como alterar esse arquivo que peguei e começar utilizar JTable.
Valeu pela força

71C4700

Este que te passei é só um exemplo nao tem como modificar…

Mas de uma olhada em JTable resolveria uma grande parte de seu probelama.

M
public void	limpa_matriz(){
	int loop = 0;
		while( loop < 10){
			for(int	line = 0; line < botao.length; line++){
				for(int	coln = 0; coln < botao.length; coln++){
					for(int	line1 =	0; line1 < botao.length; line1++){
						for(int	coln1 =	0; coln1 < botao.length; coln1++){
							if(!(botao[line][coln].getText().equals(" "))){
								if(!(botao[line1][coln1].getText().equals("	"))){
									String x = (botao[line][coln].getName());
									String y = (botao[line1][coln1].getName());

                                                   // o "x" esta vindo null!

									if( x != null && x.equals(y)){
										botao[line][coln].setText("	");
									}
								}
							}
						}
					}
				}
			}
		loop = loop + 1;
		}
	}
Criado 20 de fevereiro de 2009
Ultima resposta 20 de fev. de 2009
Respostas 9
Participantes 5