Problema de acesso com herança

22 respostas
marciocamurati

Cara essa eu acabei mexendo mexendo e agora me perdi não sei se tá certo ou não, mas não funciona seguinte, tenho o seguinte objeto com um construtor:

class Swing	extends JFrame implements ActionListener{
...
	public void escreverQuadro(String valor)	{
		quadro.setText(valor);
	}
}

E possuo um outro objeto:

class teste extends Swing	{
	public void t (String valor)	{
		if (valor.length() != 0)	{
			super.escreverQuadro(valor);
		}
	}
}

Mas ele não consegue acessar o escreverQuadro() do Swing, já tentei fazer sem o super mas não rola ele me retorna esse erro:

java.lang.NullPointerException

Deve ser alguma besteira q to fazendo, me deem essa ajuda ae valeu !

[]s

22 Respostas

V

Se ele não estivesse achando o método, seu código nem compilaria…

O NullPointer deve ser pq esse “quadro” não foi instanciado ou no seu método “t” vc tá passando um “null” e quando vc usa o “.length()” dá NullPointer tmb…

danieldestro

Em tempo: Isso não são objetos, são classes.

marciocamurati

Mal eu ainda confundo um pouco os nomes :shock:

Então o quadro está instanciado na classe Swing:

class Swing	extends JFrame implements ActionListener{
...
	public JTextArea quadro;	

	public void Painel()	{
		quadro = new JTextArea(8, 40);
		adicionarComponente(quadro, 1, 0, 4, 1, 3);	
	}

	private void adicionarComponente(...) {}

}

Testei o q o Vegetto citou desabilitando a verificação:

class recuperarValor extends Swing { public void passarValor (String valor) { //if (valor.length() != 0) { //System.out.println(valor); super.escreverQuadro(valor); //} } }

Mas não adiantou, sugestões ?

danieldestro

Algum objeto não foi instanciado. Vê no Stack trace qual a linha está ocorrendo o Null pointer Exception e você descobrirá.

marciocamurati

O que é o Stack trace ?

danieldestro

É aquele monte de informação que aparece quando ocorre um erro.

Exemplo:

java.lang.NullPointerException at java.lang.String.concat(String.java:1620) at Memo.display(Memo.java:39) at Memo.main(Memo.java:51) Exception in thread "main"

Neste exemplo acima, na segunda linha, ele fala o nome da classe e alinha do erro: (“String.java:1620”).

marciocamurati

Valeu Daniel eu perguntei antes de pesquisar e tinha visto isso que me falou agora no google, bom vou ver no que dá e posto um retorno daqui a pouco.

Valeu !

marciocamurati

O erro está no seguinte lugar:

class Swing	extends JFrame implements ActionListener{
...
	public JTextArea quadro;	

	public void Painel()	{
		quadro = new JTextArea(8, 40);
		adicionarComponente(quadro, 1, 0, 4, 1, 3);	
	}

	private void adicionarComponente(...) {}

	public void escreverQuadro(String valor)	{
		quadro.setText(valor);
	}
}

Mais precisamenta aqui:

quadro.setText(valor);

Por algum motivo que eu desconheço eu não estou tendo acesso ao JTextArea quadro que está nesta clase.

Alguem ve algo de errado por ai ?

danieldestro

Você está acessando escreverQuadro() sem antes criar o objeto “quadro”, que pelo visto é criado no método Painel().

Então, você tem que chamar o método Painel() antes do escreverQuadro().

Desculpe a sinceridade, mas seu código está mal escrito. No site da Sun fala sobre convenção de código java (procure por Java Code Convention).

marciocamurati

Eu estou estudando ainda, com o tempo vou pegando o jeito, isso são vicios que to carregando de outras linguagens estruturadas, sou novato no OO ainda, mas blz.

Se tu puder me ajudar aqui ainda pq eu inicializado o Paint() logo no começo para que o Painel seja desenhado na tela:

public static void main(String[] args)	{
	Swing f = new Swing();
	f.Painel();
}

Porisso o quadro deveria estar criado certo ? ou to viajando ?

Oque eu quero tentar fazer é montar uma tela com uma JTextArea e poder mudar o valor de lá a partir de outra clase, mas to me enrolando.

marciocamurati

Há e valeu pela dica do Conventions (http://java.sun.com/docs/codeconv/), vou dar uma olhada mais tarde nisso !

danieldestro

Pelo que entendí você quer mudar o valor de um text area de uma classe pela outra, mas você está usando herança. Será que é isso mesmo que você quer?

Mas voltando ao problema inicial, isso deve funcionar:

recuperarValor r = new recuperarValor(); r.Paint(); r.passarValor("um texto aqui");

marciocamurati

Daniel eu posso estar me enrolando :oops: esse é um dos primeiros aplicativos que to fazendo em java !

Mas se eu reexecutar o Paint ele irá redesenhar a janela pra mim ou seja abrir outra:

public void Painel()	{
		setTitle("Teste");
		
		container = getContentPane();
		
		layout = new GridBagLayout();
		
		container.setLayout( layout );
		
		constraints = new GridBagConstraints();

		constraints.weightx = 100;
		constraints.weighty = 100;
	
		
		constraints.ipady = 0;
		constraints.ipadx = 0;
				
		/*JLABEL*/
		JLabel labelFila = new JLabel("Ultimas");
		adicionarComponente(labelFila, 0, 0, 4, 1, 1);
			
		/*JTextArea*/
		quadro = new JTextArea(8, 40);
		adicionarComponente(quadro, 1, 0, 4, 1, 3);

		/*JBUTTON*/
		JButton limparQuadro = new JButton("Limpar Quadro");
		adicionarComponente(limparQuadro, 2, 0, 4, 1, 1);
		
		limparQuadro.addActionListener(this);
		
		setDefaultLookAndFeelDecorated(true);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setSize( 300, 300 );
		setVisible(true);	

		//quadro.setText("asdasd");
	
	}

	public void escreverQuadro(String valor)	{
		try	{
			this.quadro.setText(valor);
		}	catch (Exception e) { 
			System.out.println(e.getMessage());
		}
	}
	
	private void adicionarComponente(Component component, int row, int column, int width, int height,int caso)	{
		switch (caso){
			case	1:
				constraints.weightx = 10;
				constraints.weighty = 0;
				constraints.ipady = 0;
				constraints.ipadx = 0;
				constraints.fill = GridBagConstraints.HORIZONTAL;
				constraints.anchor = GridBagConstraints.NORTH;
				break;
			case	2:
				constraints.weightx = 10;
				constraints.weighty = 10;
				constraints.ipady = 20;
				constraints.ipadx = 20;
				constraints.fill = GridBagConstraints.HORIZONTAL;
				constraints.anchor = GridBagConstraints.NORTH;
				break;
			default:
				constraints.weightx = 100;
				constraints.weighty = 100;
				constraints.fill = GridBagConstraints.BOTH;
				constraints.anchor = GridBagConstraints.EAST;
				break;
		}
		
		
		constraints.gridx = column;
		constraints.gridy = row;
		
		constraints.gridwidth  = width;
		constraints.gridheight = height;
		
		layout.setConstraints( component, constraints );
		container.add( component );
		
	}

	public void actionPerformed(ActionEvent evt)	{
		Object source = evt.getSource();
		quadro.setText("");
	}

}

Essé é o Paint(), onde está o JTextArea que eu quero mudar o valor ou adicionar um valor, minha hirerarquia de “funções” pelo que parece está errado o modo como eu estou pensando para fazer oque eu quero, você poderia me ajudar a ver a forma correta ?

Valeu!

danieldestro

Cara, você primeiro precisa entender Orientação a Objetos então. Você está perdido com essas coisas.

marciocamurati

Tu me indica algum material bom sobre ?

caiofilipini

Core Java vol. I. :wink:

marciocamurati

Daniel e demais,

Andei dando um lida em diversos textos sobre oo e etc, para poder tentar solucionar o meu problema e cheguei na seguinte conclusão, e tenho a necessidade em meu aplicativo de acessar a JTextArea que já está criada quando eu crio o objeto Swing, correto ?

Só que ai me vem essa dúvida como eu posso acessar ess JTextArea que já está criada, ela é criada no main, quando eu instancio o objeto:

Swing swing = new Swing();

No caso oque eu estava fazendo era criar uma nova class e dar um extend ao Swing ou seja estava criando um novo Swing, e não utilizando o que estava criado, porisso estava me dando aqueles problemas de null e etc.

Se alguém puder me ajudar, e me dizer se conclui certo, seria bom !

[]s

danieldestro

Vou postar um exemplo BEM simples e você tenta entender o código.

import javax.swing.*;

public class MinhaTela extends JFrame {
  public JTextArea meuTextArea;

  public MinhaTela() {
    //aqui eu crio e monto a tela
    meuTextArea = new JTextArea();
    this.getContentPane().add( meuTextArea );
    this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    this.pack();
  }
}

E para usar a tela:

public class Teste {
  public static void main(String[]  args) {
    MinhaTela t = new MinhaTela();
    t.show();
    t.meuTextArea.setText("seu texto vai aqui");
  }
}

Entendeu como pode acessar o text area de fora da classe de tela, por exemplo?

marciocamurati

Daniel,

Entendi este seu exemplo, mas vamos aprimorar ele um pouco mais pra chegar aonde eu tenho realmente dúvida, seguinte vamos criar uma nova class extends TimerTask, para usar o Timer:

import java.util.TimerTask;

public class SeiLa extends TimerTask	{
	public void run()	{	
		(Como aqui eu poderia escrever naquela JTextArea)
	}

}

A main ficaria assim:

public class Teste {
  public static void main(String[]  args) {
    MinhaTela t = new MinhaTela();
    t.show();
    t.meuTextArea.setText("seu texto vai aqui");

    Timer timerHorario;
    timerHorario = new Timer();
    timerHorario.schedule(new SeiLa(), 0, 5000);	
  }
}

Nesse caso como eu poderia acessar aquela JTextArea criada, no main ?

Eu não poderia criar um novo objeto pois nesse caso eu não estaria usando o já criado na main e sim um novo e com isso não poderia estar escrevendo nele.

E neste caso como devo proceder ?

Valeu !

danieldestro

Que tal se o construtor da classe SeiLa recebesse o objeto que você quer atualizar?

public class SeiLa extends ... {
  private JTextArea t;

  public SeiLa( JTextArea a ) {
    this.t = a;
  }
}

E então:

timerHorario.schedule(new SeiLa(seuTextArea), 0, 5000);
marciocamurati

Haaaa Muleque, agora sim !

Entendi, eu passo o objeto para a outra class, agora to entendendo !

Funcionou oque eu queri fazer valeu cara, e mal por tantas questões, aproveitando posso te adicionar no MSN ?

[]s

Valeu ! Mesmo Brother !

danieldestro

Pode sim. Passa no caixa antes… UAHHauhaAhuAHUHAhuhAA…

Criado 29 de janeiro de 2005
Ultima resposta 30 de jan. de 2005
Respostas 22
Participantes 4