Interface gráfica na prática

Aula de Laboratório

Objetivos:

1. Revisão

Na última aula, vimos que interfaces gráficas (GUI) em Java são criadas através do uso adequado de componentes, containers e layouts.

Os componentes estudados foram:

Como vimos, os containers servem para agrupar componentes e organizá-los melhor:

Os layouts são usados para organizar automaticamente os componentes dentro de um container:

2. Prática

Nosso objetivo agora é praticar o uso dos elementos de GUI. A partir de hoje, iremos desenvolver uma mesma aplicação DURANTE as aulas de laboratório, ou seja, é fundamental o acompanhamento dessas aulas para uma melhor compreensão dos conceitos envolvidos

A aplicação será uma implementação (simples) em Java da linguagem LOGO. Para quem nunca ouviu falar disso, ela foi criada para ensinar programação para crianças. Possui uma sintaxe relativamente simples e as principais construções encontradas em linguagens "para adultos". O seu grande diferencial é a motivação para escrever os programas: a criança tem o objetivo de comandar uma tartaruga, capaz de desenhar figuras em uma tela gráfica.

Portanto, o que iremos fazer é um interpretador de RLOGO (Logo reduzido), em Java. O que queremos no final é uma aplicação capaz de:

A linguagem RLOGO possui os seguintes comandos:

Veja aqui um exemplo de implementação dessa linguagem.

Evidentemente, não seremos capazes de fazer tudo isso em uma única aula, mas começaremos pela parte mais importante...

	.
	.
	.
	.
	.
	.
	.
	.
	.

... que evidentemente, não é a interface gráfica, mas sim a modelagem das classes.

Precisaremos de uma classe Tartaruga, que implementará a funcionalidade da... tartaruga.

Essa classe deverá controlar a posição (x,y) e a direção (ângulo)da tartaruga na tela. Será preciso criar alguns métodos para avançar, voltar, girar, parar/começar o desenho, etc.

Exercício:

  • Além da classe Tartaruga, que outras classes você acha que essa aplicação deve apresentar ? Faça um esboço do diagrama de classes. Dica: procure pensar de forma "orientada a objetos", isto é, imagine que objetos deverão existir e como eles devem se relacionar. Um exemplo de como não fazer isso é imaginar que a classe Tartaruga faz tudo: ela não é responsável, por exemplo, pela interpretação da linguagem. Por quê ?
  • Implemente a classe Tartaruga. Não se preocupe com o desenho em si, faremos isso daqui a pouco. É interessante criar um método para retornar a posição atual da tartaruga. Dessa forma, será mais fácil de usá-la na aplicação (e testá-la, também).
  • Você provavelmente terá alguma dificuldade para implementar o movimento da tartaruga, devido à possibilidade dela estar apontada para qualquer direção. Bem, nada que um seno e um cosseno não resolva... Se você não encontrar a resposta sozinho, tire o pó do seu velho livro de geometria analítica e procure a equação paramétrica da circunferência.

Agora, vamos pensar um pouco em como desenhar na tela. Se você procurar nas classes da API Java, não vai encontrar nada útil nesse sentido. Portanto, teremos que improvisar. O que precisamos é de uma classe que já tenha funcionalidade visual (isto é, exiba algo na tela gráfica). Uma possível escolha é JPanel: apesar de sua utilidade principal ser o agrupamento de componentes, é possível desenhar dentro de um JPanel.

Mas para isso funcionar direito, será preciso criar uma especialização de JPanel, que desenhará exatamente o que queremos. Ou seja, iremos criar uma nova classe, derivada de JPanel.

Se olharmos na documentação, veremos que o método responsável por desenhar o conteúdo do JPanel é public void paintComponent(Graphics g). Isso significa que deveremos sobrescrever esse método na nossa nova clase, de forma a desenhar o que queremos. Fácil, não ?

A única questão que resta é entender o que é o parâmetro g (objeto da classe Graphics): Graphics é a classe que implementa todos os recursos de desenho em Java, ou seja, ela encapsula uma área física de desenho (na tela ou não) e os métodos para acessá-la. Consulte a documentação!

Para facilitar, veja este exemplo.

Exercício:

  • Tente usar a classe TelaDesenho apresentada acima. Crie uma interface gráfica simples e insira um objeto TelaDesenho nela. Verifique o funcionamento.
  • Quando a tela é redesenhada ? Você pode prever isso ?
  • Procure modificar a classe TelaDesenho para desenhar outras coisas (invente, experimente os outros métodos da classe Graphics)

Se tudo correu conforme o planejado, você já tem uma Tartaruga implementada e uma área de desenho funcional. O próximo passo é juntar as duas, ou seja, fazer a tartaruga passear na área de desenho. Mas isso, no próximo capítulo.

Você chegou ao final desta importante etapa. Revise os conceitos e prepare-se: iremos adicionar funcionalidade à sua interface!