Problemas com public void init ( ) e o public void paint (Graphics g),

4 respostas
M

Olá!

Pessoal, sou novo em programação Java e estou encontrando uma dificuldade:

Não estou conseguindo declarar o public void init ( ) com o public void paint (Graphics g), ja importei todas as classes e extençoes usadas para os dois metodos main, mas nao estou conseguindo faze-los funcionar, ou funciona um ou outro, não sei se estou especificando direito os metodos. Se alguem poder me ajudar:

import javax.swing.JApplet;

import javax.swing.JOptionPane;

import java.awt.Graphics;

public class Ler_as_notas extends JApplet {

public void init ( )

{

String ler1, ler2, continuar;				

double ler_1,ler_2, resultado;			

int cont=1;

public void paint (Graphics g)
{

super.paint(g);
do

{

ler1 = JOptionPane.showInputDialog (“Ler a Primeira Nota:);

ler_1 = Double.parseDouble(ler1);

ler2 = JOptionPane.showInputDialog (“Ler a Segunda Nota:);

ler_2 = Double.parseDouble(ler2);

resultado = ( ler_1 + ler_2 )/2;

if (resultado >=6 )
{

JOptionPane.showMessageDialog(null, "Aluno Aprovado com média: "    + resultado, "Aprovado", JOptionPane.INFORMATION_MESSAGE);

 g.drawString ("Aluno Aprovado", 25,45);	 // NAO APARECE

}

else
if (resultado >= 3 && resultado <6)

{
JOptionPane.showMessageDialog (null, "Aluno em Recperação com  média: " + resultado, Recuperação, JOptionPane.INFORMATION_MESSAGE);

g.drawString (Aluno Recuperação, 25,45);

}

else

if (resultado<3)

{

JOptionPane.showMessageDialog(null, "Aluno rodou com média: " + resultado, Rodou, JOptionPane.INFORMATION_MESSAGE);

g.drawString (“Aluno REPROVADO”, 25,45);			

}
continuar= JOptionPane.showInputDialog (Deseja Continuar: ==20);

cont= Integer.parseInt(continuar);

}

while (cont ==20 );

JOptionPane.showMessageDialog (null,“TCHAU”, “T+”, JOptionPane.INFORMATION_MESSAGE);

}

}

}

4 Respostas

Fox_McCloud

Em primeiro lugar, identação é fundamental. Por exemplo, eu tive dificuldades para encontrar o fechamento do seu bloco init. Utilize o bloco "code" quando postando código, ele tentará organizar corretamente o seu código.

Pelo que eu entendi, você colocou o paint() dentro do init(), o que não deve ocorrer, pois são dois métodos separados.

O paint() não pode ser chamado por você, quem o chama é a JVM (a máquina virtual), fornecendo a ele a referência para o seu hardware gráfico (o objeto Graphics g), então coloque dentro do paint() o que você deseja que seja desenhado, e se você quiser que o paint() seja chamado pela JVM, use repaint(). Veja um exemplo (ele roda, se você quiser testá-lo):

import javax.swing.JApplet;

import java.awt.Color;
import java.awt.Graphics;

public class QuadradoAleatorio extends JApplet {
	
	private final Color[] cores = {Color.BLUE,Color.RED,Color.GREEN};
	
	public void start(){
		new Thread(new Runnable(){
			public void run() {
				while(true){
					// aqui o paint() é chamado pela JVM
					repaint();
					try {
						// pausa de 1 segundo
						Thread.sleep(1000);
					} catch (InterruptedException e) {}
				}
			}
		}).start();
	}
	
	public void paint(Graphics g){
		// sorteio de uma das três cores
		g.setColor(cores[(int)(Math.random()*cores.length)]);
		// desenhando o quadrado
		g.fillRect(0,0,100,100);
	}
	
}
Veja que eu não usei o método init(). Uma classe que extende JApplet pode sobrescrever quatro métodos referentes ao seu fluxo de execução:

init(){} - usado para inicializar os recursos (atributos) que serão usados no aplicativo.

start(){} - usado para iniciar o programa, no caso eu usei para disparar a Thread que fica fazendo a interação do programa.

stop(){} - usado para finalizar o programa (eu poderia ter usado, por exemplo, para mudar o estado de um atributo booleano "rodando" de forma a fazer o loop da Thread terminar).

destroy(){} - usado para desalocar recursos alocados no JApplet, liberando memória e fechando arquivos, por exemplo.

Boa sorte e lembre-se: organização ajuda muito, a identação e o uso das regras de nomenclatura do Java são boas linhas gerais que, sendo seguidas, te ajudarão a nunca se perder no seu código.

M

Bom, consegui solucionar o problema, mas agora nao consigo fazer com que o If funcione também, como posso arrumar??

Olha o codigo:

import java.awt.Graphics;
import javax.swing.JOptionPane;
import javax.swing.JApplet;

public class TESTE extends JApplet {

public void init ( )

{ //ABRE CHAVES DO INIT

String a,b,c;
int aa,bb,cc;

a= JOptionPane.showInputDialog("DIGITE:");
aa= Integer.parseInt (a);

b= JOptionPane.showInputDialog ("DIGITE2:");
bb= Integer.parseInt(b);

cc= aa+bb;

JOptionPane.showMessageDialog(null, "Resultado: " + cc);

} // FECHA CHAVES DO INIT

public void paint (Graphics g)

{ //ABRE CHAVES DO GRAPHICS
super.paint(g);

if (cc > 10) //PROBLEMAS COM ESSE IF

{
JOptionPane.showMessageDialog (null,"Aprovado");
g.drawString ("Aprovado", 25,25);
}

} //FECHA CHAVES DO GRAPHICS

}[code]

O if nao esta funcionando, ele não mostra no final do applet o resultado, separei todas os metodos, mas como uso comandos em metodos que nao sao os de origem??

[ ] s

M

msantunes:
Olá!

Pessoal, sou novo em programação Java e estou encontrando uma dificuldade:

Não estou conseguindo declarar o public void init ( ) com o public void paint (Graphics g), ja importei todas as classes e extençoes usadas para os dois metodos main, mas nao estou conseguindo faze-los funcionar, ou funciona um ou outro, não sei se estou especificando direito os metodos. Se alguem poder me ajudar:

import javax.swing.JApplet;

import javax.swing.JOptionPane;

import java.awt.Graphics;

public class Ler_as_notas extends JApplet {

public void init ( )

{

String ler1, ler2, continuar;				

double ler_1,ler_2, resultado;			

int cont=1;

public void paint (Graphics g)
{

super.paint(g);
do

{

ler1 = JOptionPane.showInputDialog (“Ler a Primeira Nota:);

ler_1 = Double.parseDouble(ler1);

ler2 = JOptionPane.showInputDialog (“Ler a Segunda Nota:);

ler_2 = Double.parseDouble(ler2);

resultado = ( ler_1 + ler_2 )/2;

if (resultado >=6 )
{

JOptionPane.showMessageDialog(null, "Aluno Aprovado com média: "    + resultado, "Aprovado", JOptionPane.INFORMATION_MESSAGE);

 g.drawString ("Aluno Aprovado", 25,45);	 // NAO APARECE

}

else
if (resultado >= 3 && resultado <6)

{
JOptionPane.showMessageDialog (null, "Aluno em Recperação com  média: " + resultado, Recuperação, JOptionPane.INFORMATION_MESSAGE);

g.drawString (Aluno Recuperação, 25,45);

}

else

if (resultado<3)

{

JOptionPane.showMessageDialog(null, "Aluno rodou com média: " + resultado, Rodou, JOptionPane.INFORMATION_MESSAGE);

g.drawString (“Aluno REPROVADO”, 25,45);			

}
continuar= JOptionPane.showInputDialog (Deseja Continuar: ==20);

cont= Integer.parseInt(continuar);

}

while (cont ==20 );

JOptionPane.showMessageDialog (null,“TCHAU”, “T+”, JOptionPane.INFORMATION_MESSAGE);

}

}

}

Fox_McCloud

O que nós temos aqui é um problema clássico de escopo.

Como você definiu as variáveis dentro do método init(), apenas esse método irá enxergá-las. Para que a classe toda enxergue as variáveis, é preciso defini-las dentro da classe, mas fora de qualquer método, e assim criamos os chamados atributos da classe, que são enxergados por todos os seus métodos.

O escopo de uma variável pode ser traduzido como o(s) lugar(es) onde essa variável é válida. E na verdade ela é válida dentro do bloco onde é definida, sendo que um bloco é delimitado por { e }. Assim, se eu abro o bloco da classe e defino a variável em seguida, o escopo dessa variável será a classe toda, até o fim do seu bloco. Se eu abro o bloco de um método e defino uma variável em seguida, o escopo dessa variável será apenas o método, até o seu fechamento.

Para usar atributos de classe, é fundamental conhecer modificadores de acesso (private, default, protected, public), que eu não usei no exemplo abaixo para não misturar muita informação.

Outra coisa: eu insisto em recomendar que você procure entender a finalidade da existência dos métodos init(), start(), stop() e destroy(), que eu citei na outra resposta, a lógica do applet não deve ficar no método init(), nem mesmo no método start(), essa lógica deve ficar em métodos criados para tal, sendo que os quatro métodos de fluxo do applet devem ser utilizados para o que são definidos, já que o applet os chama nos momentos adequados da execução do programa. Da mesma forma não deve haver um JOptionPane.showMessageDialog() dentro do método paint(), já que ele existe para desenhar na tela, não para emitir mensagens. Mesmo que ele precise emitir uma mensagem de erro, por exemplo, ele pode disparar uma exceção com a mensagem, e a mensagem deverá ser exibida pelo método adequado.

Essas misturas são possíveis, e funcionam, mas comprometem a organização do código, quando você estudar engenharia de software verá que o cuidadoso planejamento das classes e de seus métodos internos é o que diferencia um software profissional, reutilizável, expansível e de fácil manutenção de um "pograma"!

:lol:

Não digo isso para desestimular, o começo é assim mesmo e você está pegando rápido o espírito da coisa, é que é bom começar a pensar na organização do código desde cedo.

Veja a versão do seu applet que funciona:

import java.awt.Graphics;
import javax.swing.JOptionPane;
import javax.swing.JApplet;

public class Teste extends JApplet {

	// Removendo os atributos do método init() e colocando-os fora
	// de qualquer outro método, eu os transformo em atributos da
	// classe, acessíveis por qualquer método.
	// Isso é uma mudança de escopo.
	String a, b, c; // eu mantive o seu código, mas c não é usado.
	int aa, bb, cc;
	
	public void init(){ // ABRE CHAVES DO INIT
		a = JOptionPane.showInputDialog("DIGITE:");
		aa = Integer.parseInt(a);

		b = JOptionPane.showInputDialog("DIGITE2:");
		bb = Integer.parseInt(b);

		cc = aa + bb;

		JOptionPane.showMessageDialog(null, "Resultado: " + cc);
	} // FECHA CHAVES DO INIT

	public void paint(Graphics g){ // ABRE CHAVES DO GRAPHICS
		super.paint(g);

		if (cc > 10) // Agora o paint() encherga a variável cc

		{
			JOptionPane.showMessageDialog(null, "Aprovado");
			g.drawString("Aprovado", 25, 25);
		}
	} // FECHA CHAVES DO GRAPHICS

}
Criado 26 de julho de 2006
Ultima resposta 27 de jul. de 2006
Respostas 4
Participantes 2