Duvida com leitura do teclado

6 respostas
D

Olá pessoal, estou aqui hoje para sanar uma duvida que esta me perseguindo nos trabalhos que eu faço.
Bom vamos lá:

Quando eu estou lendo dados do teclado já a algumas vezes me deparei com a seguinte situação

public void AtendeAdministrador() {
		Scanner teclado = new Scanner(System.in);
		try {
			int opcao = -1;
			do {
				System.out.println(servidor.MostraOpcoes());
				opcao = teclado.nextInt();
				if (opcao == 1) {
					System.out.println(servidor.VisualisarLivros());
				} else if (opcao == 2) {
					int ano_pub;
					String titulo;
					System.out.println("Entre com o titulo do livro:");
					titulo = teclado.nextLine();
					titulo = teclado.nextLine();
					System.out.println("Entre com o ano de publicacao:");
					ano_pub = teclado.nextInt();
					if (servidor.InserirLivros(titulo, ano_pub) == 1)
						System.out.println("Livro inserido com sucesso!");
					else
						System.out.println("Erro ao inserir livro");
				} else if (opcao == 3) {
					int cod_livro;
					System.out.println("Entre com o codigo do livro");
					cod_livro = teclado.nextInt();
					if (servidor.RemoverLivros(cod_livro) == 1)
						System.out.println("Livro Removido com sucesso!");
					else
						System.out.println("Erro ao remover livro");
				} else if (opcao > 4) {
					System.out.println("Entre com uma opção valida");
				}
			} while (opcao != 4);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

Então percebam que ali na linha 14 e 15 do codigo estou tendo que ler do teclado duas vezes isso se da pelo motivo que
se eu não fizer isso ele simplesmente ignora o primeiro da linha 14 e vai direto para a linha 17 na outra leitura do teclado.
Isto já me aconteceu algumas vezes e sempre resolvo o problema com essa linha duplicada de leitura, mas agora estou curioso para descobrir
qual é o problema com isso…
quando eu programava em c tinha uma função que chamava fflush e passava como parametro o arquivo de entrada stdin e ai ele limpava o buffer de leitura.
será que isso acontece com o java tenho que limpar o arquivo de entrada?

Obrigado a todos!

6 Respostas

kritiuns

Cara testei aqui e parece que isso acontece quando vc usa um nextInt e depois um nextLine não sei o porque mais quando mudei o primeiro para nextLine
ele passo tranquilo no proximo nextLine

public void AtendeAdministrador() {  
        Scanner teclado = new Scanner(System.in);  
        try {  
            int opcao = -1;  
            do {  
                System.out.println(servidor.MostraOpcoes());  
                opcao = Integer.parseInt(teclado.nextLine());  
                if (opcao == 1) {  
                    System.out.println(servidor.VisualisarLivros());  
                } else if (opcao == 2) {  
                    int ano_pub;  
                    String titulo;  
                    System.out.println("Entre com o titulo do livro:");  
                    titulo = teclado.nextLine();  
                    System.out.println("Entre com o ano de publicacao:");  
                    ano_pub = Integer.parseInt(teclado.nextLine());  

                   //...
D

Pois é eu estava procurando e tinha ouvido falar alguma coisa assim,
mas pq será que isso acontece será que é só quando estamos lendo um inteiro e depois uma string…
isso é estranho…

estou fazendo alguns testes aqui…
por acaso vc sabe se tem alguma função de flush do buffer de leitura?

Obrigado!

kritiuns

Sei não cara… mais vc poderia utilizar a classe JOptionPane para pegar valores passadas pelo usuário … não sei se vc conhece mais ai vai um exemplo

String nome = JOptionPane.showInputDialog("Entre com seu nome:");

para converter é o mesmo skema …

int nome = Integer.parseInt(JOptionPane.showInputDialog("Entre com sua idade:"));

um Abraço !!!

D

Esse ai eu não conhecia… eu vou estudar a parte de interface do java que simples para criar uma janela… teria como fazer algo simpes assim
para capturar o login e senha no mesmo messagebox ?

RenanRosa

diegosimioni:
Esse ai eu não conhecia… eu vou estudar a parte de interface do java que simples para criar uma janela… teria como fazer algo simpes assim
para capturar o login e senha no mesmo messagebox ?

eu acho que pra isso fica bem melhor fazer com um jdialog, pois você pode personalizar.
Acho que o messagebox não tem esse suporte para senhas.
Mas… pode fazer assim tambem:

JTextField firstName = new JTextField();
JTextField lastName = new JTextField();
JPasswordField password = new JPasswordField();
final JComponent[] inputs = new JComponent[] {
                new JLabel("First"),
                firstName,
                new JLabel("Last"),
                lastName,
                new JLabel("Password"),
                password
};
JOptionPane.showMessageDialog(null, inputs, "My custom dialog", JOptionPane.PLAIN_MESSAGE);
System.out.println("Dados: " +
                firstName.getText() + ", " +
                lastName.getText() + ", " +
                password.getText());
D

Opa obrigado vou testar esse agora aqui…
é que com o java eu ainda não trabalhei fazendo interface então conheço bem pouco… estou trabalhando com jsf e seam para fazer as interfacer mas é web…
para desktop eu não tinha mexido…

valeu mesmo!

Criado 20 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 6
Participantes 3