Entrada de Dados com JOptionPane

8 respostas
O

Pessoal, tenho os seguintes programinhas básicos para se fazer um circulo com a entrada do raio pela teclado.

DesenhaCirculo.java
/*
 * Created on 11/05/2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

import javax.swing.JFrame;
import java.awt.Container;
public class DesenhaCirculo extends JFrame{
	
	public DesenhaCirculo() {
		super("título");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c = getContentPane();

		c.add(new Circulo());
		
		this.setSize(800,600);
		this.show();
	}
	
	public static void main (String args[]) {
		DesenhaCirculo desenhaCirculo  = new DesenhaCirculo();
	}
}
Circulo.java
/*
 * Created on 11/05/2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author adenilson.mezini
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */


import java.awt.Graphics;
import java.awt.Canvas;
import javax.swing.*;

public class Circulo extends Canvas{

	private Graphics g;
	
    public void desenhaCirculo(int x1, int y1, int Raio) {

  		int x, y;
		float direcao = 1 - Raio;

		x = 0;
		y = Raio;

		while (x < y) {
			if (direcao < 0)
			{
				direcao = direcao + 2*x + 3;
				x++;
			}
			else
			{
				direcao = direcao + 2*(x - y) + 5;
				x++;
				y--;
			}

			g.drawLine(x + x1, y + y1, x + x1, y + y1);
			g.drawLine(x1 - x, y + y1, x1 - x, y + y1);
			g.drawLine(x + x1, y1 - y, x + x1, y1 - y);
			g.drawLine(x1 - x, y1 - y, x1 - x, y1 - y);
			g.drawLine(y + y1, x + x1, y + y1, x + x1);
			g.drawLine(y1 - y, x + x1, y1 - y, x + x1);
			g.drawLine(y + y1, x1 - x, y + y1, x1 - x);
			g.drawLine(y1 - y, x1 - x, y1 - y, x1 - x);
		}
    }//Função para desenhar o círculo utilizando o "Midpoint Algoritm"

    
    public void paint(Graphics g)
 	{
		int raio=0;
		String msg="";
 	
		this.g = g;
		msg = JOptionPane.showInputDialog("Digite o Raio: ");
		raio = Integer.parseInt(msg);

		desenhaCirculo(300,300,raio);
			JOptionPane.exit(0);
 	}

}

Compilando e executando o desenhacirculo, ele pede a entrada do raio através de um JOptionPane.
Está funcionando, mas o JOptionPane entre em looping.
Como eu faço para que após a 1º entrada de dados não apareça mais a caixa de diálogo?

valeu@

:lol: :lol: :lol: :lol: :lol:

8 Respostas

T

Credo, não ponha entrada de dados no método paint.
Ele é chamado freqüentemente pela sua aplicação - na verdade quase toda vez que se “estraga” o desenho mostrado, por exemplo passando uma janela por cima, o método paint é chamado. Se por exemplo o JOptionPane mostrou uma janela por cima da sua aplicação, então o paint será chamado novamente (não é o JOptionPane que entrou em loop).
Ponha em outro lugar, mas não ali.

O

Qual é a sua sugestão Thiogo?

valeu :lol:

T

Bom, para não mexer muito no seu programa, você pode pôr um flag…
Algo que você teste antes de chamar JOptionPane. Na primeira vez que você chamar JOptionPane, sete o flag para true. Depois, se o flag estiver true, você não chama mais.

OT: Acho que o FindBugs deve, ou devia ter uma regra do tipo “Excesso de flags booleanos indica problemas”. É que normalmente a gente põe um monte de flags para quebrar galhos e acaba se estrepando depois.

O

Bem, fiz o código mas ele não ficou muito funcional...
Mas, td bem....

Agora estava fazendo uma aplicação para entrar com as coordenadas de uma reta e a mesma ser desenhada.

Reta.java
/*
 * Created on 10/05/2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author celso.sasazawa
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.awt.*;
import javax.swing.*;



public class Reta extends Canvas{
	
	private Graphics g;
	boolean flag=false;
	int x1, y1, x2, y2;
	String msg;
	
public void desenhaReta(int x1, int y1, int x2, int y2)
{
		float m, b;
		int x, y;
		//Desenha uma reta na horizontal
		if (y1 == y2)
		{
			for (x=x1;x<=x2;x++)
				g.drawLine(x,y1,x,y1);
		}
		else
		{
			if (x1==x2)
			{
				for(y=y1;y<=y2;y++)
					g.drawLine(x1,y,x1,y);
			}
			
			if (x1!=x2)
			{
				m = (y2 - y1) / (x2 - x1);
				b = y1 / (m * x1);
				for (x=x1; x<=x2; x++)
				{
					y = Math.round(m*x + b);
					g.drawLine (x, y, x, y);
				}
			}
		}		
}

	
// Função para desenhar reta utilizando a equação reduzida

	public void paint(Graphics g) {
		this.g = g;
		
		if(!flag) {
			msg = JOptionPane.showInputDialog("Digite do Eixo X1: ");
			x1 = Integer.parseInt(msg);
			msg="";

			msg = JOptionPane.showInputDialog("Digite do Eixo Y1: ");
			y1 = Integer.parseInt(msg);
			msg="";

			msg = JOptionPane.showInputDialog("Digite do Eixo X2: ");
			x2 = Integer.parseInt(msg);
			msg="";

			msg = JOptionPane.showInputDialog("Digite do Eixo Y2: ");
			y2 = Integer.parseInt(msg);
			msg="";

			desenhaReta(x1, y1, x2, y2);

			flag=true;
			
		}
		
		//desenhaReta(10,100,300,400);
		//desenhare(x1,y1,x2,y2)
	}
}
DesenhaRetaSwing.java
import java.awt.Container;

/*
 * Created on 11/05/2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

import javax.swing.JFrame;
import java.awt.Container;

/**
 * @author celso.sasazawa
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class DesenhaRetaSwing extends JFrame {
	
	public DesenhaRetaSwing() {
		super("título");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		
		c.add(new Reta());
		
		this.setSize(500,500);
		this.show();
	}
}
Principal.java
import javax.swing.*;

public class Principal
{
	public static void main(String[] args) 
	{
		String msg;
		int opcao;
		msg = JOptionPane.showInputDialog("Digite a opção desejada para:\n 1 - Círculo \n 2 - Reta");
		opcao = Integer.parseInt(msg);
	
		if(opcao == 1) {
			//DesenhaCirculo circulo = new DesenhaCirculo();
			
		} else {
			if(opcao==2) {
				DesenhaRetaSwing reta = new DesenhaRetaSwing();
			}
		}
	}
}

Só que o JOptionPane entra em looping quando eu o chamo.

Att,

:lol: :lol: :lol: :lol: :lol: :lol:

Renan

T

Bem-vindo ao mundo do processamento paralelo!

Como eu lhe falei, já que você insistiu em usar o Paint, está sofrendo as conseqüências. Experimente jogar o “flag = true” exatamente depois do teste, não no fim da entrada de dados.

if(!flag) {
                        flag = true; // porque isto melhora o seu problema? 
 			msg = JOptionPane.showInputDialog("Digite do Eixo X1: ");
...

Tem outros métodos que você poderia ter usado, acho que o pior deles era pôr no paint. Dê uma olhada em outros programas parecidos, para ver em que evento (método) é que se põe a entrada de dados.

O

Thiago, eu setei o flag antes de exibir a mensagem mas não deu certo.

Deve haver outro jeito…mas mesmo assim, obrigado!

H

to precisando de ajuda em relação a entrada de dados com o JOptionPane…

no caso de variáveis Inteiras
eu crio uma variavel string e dpois atribuo o valor dela a uma inteira…

no caso:
quant = Integer.parseInt(msg);

mas eu preciso de entrar com uma variável tipo Char

alguem tem como me ajudar?

obrigado.

S

[b][color=green]String raaio = JOptionPane.showInputDialog(“Informe o raio :”);
int raio = Integer.parseInt(raaio);

//Diâmetro
double diametro = 2 * raio;

<a href="//System.out.println">//System.out.println</a>("Diametro = "+diametro);

JOptionPane.showMessageDialog(null, diametro);[/color][/b]

Olá , como voces podem ver neste pedaço de código , criei um código para receber o raio e calcular o diâmetro , a área e o comprimento de uma circunferência.
A questão é que eu queria mostrar usando o JOptionPane alguma mensagem do tipo

JOptionPane.showMessageDialog(O diametro da circunferencia e = , diametro); ou

JOptionPane.showMessageDialog("O diametro da circunferencia e = ", diametro); ou ainda

JOptionPane.showMessageDialog('O diametro da circunferencia e = ', diametro);

mas o melhor que eu consegui foi

JOptionPane.showMessageDialog(null, diametro); , em que a mensagem só retorna o nº da variável diâmetro .

Alguma sugestão ??? Grato pela ajuda .

Criado 11 de maio de 2005
Ultima resposta 2 de set. de 2012
Respostas 8
Participantes 4