Objectivos

  • Exercitar a utilização da framework de interação com o utilizador a aplicar no projecto

Actividade

  1. Perceber as funcionalidades das classes MenuCommand, Form e Display.
  2. Resolução do enunciado da aula.
  3. Ver o enunciado do 8º Exercício de Programação

A Framework de Interacção com o Utilizador

Os alunos devem ler, com atenção, a documentação respeitante à framework de interacção com o utilizador po-ulib presente na secção po-uilib antes de começarem a realizar o trabalho pedido neste laboratório.

Resumidamente, a funcionalidade de mostrar as operações disponíveis e executar a opção escolhida pelo utilizador é concretizada pelas classes Menu e Command. A classe Command representa uma operação genérica que pode ser executada sobre uma dada entidade. Cada comando sabe o título da operação que representa (é utilizado no menu para indicar os títulos das operações disponíveis). Esta classe abstracta define o método abstracto execute() que executa a operação. Cada operação a disponibilizar num menu terá que ser concretizada numa sua subclasse. A classe Menu recebe um vector de comandos e mostra os títulos destes comandos por forma a que os utilizadores saibam as operações disponíveis. Cabe ainda ao menu executar o comando correspondente à opção escolhida pelo utilizador. 

Por forma a centralizar (e assim permitir a reutilização de código) a interface com o utilizador, existe uma classe, chamada Form, que é responsável pela interacção com o utilizador. Esta classe fornece métodos que permitem escrever uma cadeia de caracteres (prompt) e ler um determinado tipo de dados inserido pelo utilizador consoante a instância de Input escolhida. Esta classe concentra todas as operações de leitura de dados (fornecidos pelo utilizador). Os dados lidos são validados, i.e., apenas são aceites dados correctos. No caso do utilizador inserir dados inválidos, é pedida a respectiva re-introdução.
A classe Display da framework permite apresentar uma determinada mensagem ao utilizador. Mais informação pode ser consultada na documentação da framework.

Enunciado da Aula

 A interface com o utilizador a desenvolver deve disponibilizar um menu com as operações disponíveis para os clientes desta aplicação. As operações disponíveis para o utilizador são:

  • Criar um círculo;
  • Criar um quadrado;
  • Criar uma linha;
  • Desenhar as formas;
  • Escrever o número de formas do editor.
  • Desenhar as formas por ordem crescente de identificador.

Estas operações devem estar agrupadas num único menu. O menu deve disponibilizar as operações de criar um círculo, criar um quadrado, criar uma linha, apagar uma forma, desenhar as formas do editor e escrever o número de formas do editor.

Trabalho Proposto

  1. As cadeias de caracteres que indicam o título do menu e dos comandos a criar estão definidas nesta entidade: Label.
  2. O menu principal já está parcialmente concretizado na classe MainMenu (disponível no ficheiro MainMenu.java). Esta classe apenas precisa de definir o construtor, passando a lista de opções do menu (representado por um array de Commands). A versão disponibilizada contém apenas as opções de desenhar o editor (DoDraw) e de escrever o número de formas do editor (DoShowTotal). Estes dois comandos não estão finalizados, o método execute() está vazio. Finalize-os
  3. Crie a classe editor.app.App que terá como responsabilidade criar uma instância do menu principal, criar a instância do domínio da aplicação responsável por gerir a informação do editor, abrir o menu criado e executar a instrução pt.tecnico.po.ui.Dialog.IO.close() a seguir a abrir o menu. Esta instrução tem com responsabilidade libertar recursos relacionados com a framework de interacção com o utilizador quando esta já não é necessária. Esta classe já está parcialmente concretizada em App.
  4. Compile a aplicação e execute-a:
    1. Atenção, para compilar e correr a aplicação tem que definir correctamente a variável classpath. Supondo que está no directório que contém o package raiz (editor) desta aplicação e que o ficheiro jar com a framework de interacção com o utilizador também está neste directório, então a variável classpath deve ser definido como ".:po-uilib.jar". Assim, para compilar todas as classe pode dar o seguinte comando: javac -cp .:po-uilib.jar: `find editor -name "*.java"`. 
    2. Para correr a aplicação deverá utilizar o mesmo valor para classepath: java -cp .:po-uilib.jar: editor.app.App
  5. Crie uma nova classe comando que deverá criar um círculo (DoCreateCircle). O método execute() deste comando deverá pedir três números (coordenadas (x, y) do centro e raio) ao utilizador (pode utilizar as cadeias de caracteres que achar melhor para definir a pergunta associada a cada número) e adicione este novo comando ao menu principal. Após ter criado o círculo, o comando deve apresentar o identificador da forma criada.
  6. Compile o código da aplicação execute-a de novo. Agora deve ser possível criar círculos.
  7. Acrescente uma nova opção ao menu principal que terá como responsabilidade desenhar as formas do editor por ordem crescente do identificador de forma. Note que a lista de formas devolvida pelo editor não respeita necessariamente esta ordenação dado que é possível colocar uma forma do editor no início ou no fim:
    • A ordenação das formas deve ser concretizada com base na interface Comparator e no método estático sort da classe Collections disponíveis na biblioteca do Java. 
    • Assim será necessário especificar um comparador de Form  que compare duas formas e indica qual é a que tem um identificador maior.
    • Tenha em atenção que a execução desta funcionalidade não deverá alterar a ordem pela qual as formas estão guardadas no editor.
  8. Crie os dois comandos que restam, criação de um quadrado e de uma linha (DoCreateSquare e DoCreateLine, respectivamente).
  9. Compile o código e corra aplicação de novo (devendo agora ser visível estas novas opções).
  10. Caso tenha tempo, pode começar a realizar o exercício de programação 8.
Solução: editor-ap7.jar

Exercício de Programação

Caso tenha tempo, pode ler o enunciado do 8º Exercício de Programação (EP8). Este exercício pode ser entregue até ao início da próxima aula de laboratório.