Interface gráfica na prática (3)

Aula de Laboratório

Objetivos:

Se você está seguindo as aulas corretamente, deve ter uma interface gráfica simplificada, com apenas a área de desenho e alguns botões para teste... A sua tartaruga provavelmente já anda pela tela, mas não desenha nada...

O problema de desenhar na tela é que tudo tem que ser feito dentro do método paintComponent(como você já sabe), então o que temos que fazer efetivamente é interpretar os comandos em cada uma das linhas da área de texto...

A área de texto em si não tem nada de especial: cada linha contém um único comando (exceto se for o REPEAT). Porém, para interpretá-la, primeiro é necessário obtê-la: existe um método para isso, chamado getText(), dentro da classe JTextArea. Esse método retorna uma longa String, contendo todo o texto, separado por linha.

Agora, é só ler cada linha e interpretar o seu conteúdo. O modo mais fácil de fazer isso é usar uma classe específica chamada StringTokenizer.

Esta classe é capaz de varrer um String e quebrá-lo em tokens, isto é, palavras-chave separadas por algum caractere delimitador (como espaços em branco ou vírgulas, por exemplo). Veja este exemplo:

     import java.util.*; // para usar StringTokenizer
     ...
     StringTokenizer st = new StringTokenizer("Este é um teste");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }

O método st.hasMoreTokens() retorna true enquanto houver algo na String... Esse trecho de código produzirá a seguinte saída:

	Este
	é
	um
	teste

Como o objeto st foi instanciado com o construtor padrão, isto é, só enviando a String a ser interpretada, são usados os delimitadores padrão: espaço em branco, tab, \n, e \r. Se você quiser usar outros delimitadores, deverá especificá-los na chamada st.nextToken:

     import java.util.*; // para usar StringTokenizer
     ...
     StringTokenizer st = new StringTokenizer("Veja: este também funciona, certo");
     while (st.hasMoreTokens()) {
     	System.out.println(st.nextToken(" :,"));
     }

Agora, ele também conseguirá separar as palavras por dois pontos e vírgulas:

	Veja
	este
	também
	funciona
	certo

Muito mais fácil, não ? Basta agora ler o texto linha a linha e interpretar os comandos da linguagem, que como você deve lembrar, são:

Exercício:

  • Medite um pouco sobre quem deve interpretar os comandos... É a Tartaruga, certo ? Será ? Pense no que implicaria escrever o interpretador dentro da classe Tartaruga... Será que não existe uma maneira melhor de fazer isso ?
  • Faça a interpretação dos comandos na área de texto. Se você não fez ainda, crie um botão "Run" para executar o programa. Para testar, apenas exiba no console o comando interpretado e seu parâmetro(s). Faça isso antes de tentar desenhar alguma coisa! E deixe o comando REPEAT por último...
  • Tente fazer apenas o movimento da tartaruga: a partir do comando corretamente interpretado, chame os métodos correspondentes na classe Tartaruga (que estão implementados). Verifique se ela andou corretamente...
  • Agora você pode desenhar: crie uma flag para indicar se a pena está para cima (não desenha) ou para baixo (desenha). No caso de desenhar, ao movimentar a tartaruga é necessário traçar uma linha entre o ponto anterior e o ponto atual. Note que a tartaruga só desenha nos comandos FD e BK...

Se você chegou até aqui, sua aplicação já deve estar praticamente pronta. Experimente melhorar um pouco a interface ou até mesmo pensar um pouco sobre a sua modelagem. Ela está correta ? Será que não é possível torná-la mais eficiente ?

Uma das coisas que poderiam ser pensadas é a possibilidade de se ter mais de uma tartaruga na tela. O que isso implicaria no código ? E se tivéssemos tipos diferentes de tartarugas, que desenhassem ou se movimentassem de maneiras diversas ? Pense em como a programação orientada a objetos poderia facilitar esse trabalho...

A aplicação já funciona ? Ótimo. A seguir, iremos salvar e recuperar o programa digitado...