proj1-07

Dando sequencia a nossa série sobre o desenvolvimento para Java ME e, como prometido no episódio passado, serão explorar algumas das classes que podem compor uma instância da classe Form.

Olhando a figura abaixo podemos perceber que todas as classes que representam componentes gráficos, com exceção de Canvas, são filhas da classe Item.

Relação entre Form e as subclasses de Item

Relação entre Form e as subclasses de Item

Item

A classe Item encapsula as seguintes responsabilidades:

  • Gerenciamento de Commands: falerei de Commands em um outro post.
  • Desenho: uma instancia de Item e qualquer uma de suas subclasse sabe como desenhar a si próprio.
  • Manipulação de Eventos: manipular eventos de baixo nível como o digitar de tecas.
  • Preferências de Layout: uma instancia de Item sinaliza ao Form em que está contido sobre como ele dever ser ‘acomadado’. Essa sinalização é utilizada pela política de layout do Form para apresentar todos os itens da forma mais coesa possível.

A seguir encontra-se o básico de algumas classes que estendem Item. Para isso, crie um novo MIDlet project no Eclipse e um pacote chamado gui. Dentro desse pacote iremos criar algumas classes de demonstração dos componentes visuais CLDC.

StringItem

Um StringItem é uma classe que permite adicionar a um Form um componente de texto read-only com um rótulo (Label) e um texto (String). Ao instanciar um StringItem você pode definir três parâmetros: um Label (String), um Texto (String) e um Appearence (constante). Esse último parâmetro pode ser um dos seguintes valores: StringItem.PLAIN, StringItem.HYPERLINK ou StringItem.BUTTON.

No código abaixo não irei passar nenhum parâmetro do tipo appearence pois, para que eles fiquem realmente visíveis é necessários que estejam associados a algum Command. Também estou procurando deixar as coisas o mais simples possível 😉 .


public class StringItemExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private StringItem si1, si2, si3;

	public StringItemExemplo()
	{
		display = Display.getDisplay(this);

		si1 = new StringItem("Nome: ", "Rafael Viana Lopes Araújo");
		si2 = new StringItem(null, "Esse é um StringItem sem um Label");
		si3 = new StringItem("Um Label sem um Texto", null);

        	// Array de Item que será passado ao construtor de myForm.
		Item[] stringItems = new Item [] {si1, si2, si3};

		// Outro modo de instanciar um Form.
		myForm = new Form("StringItems", stringItems);</strong>
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException
	{
		// nada aqui
	}

	protected void pauseApp()
	{
		// nada aqui
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}

Exemplos de StringItem

Exemplos de StringItem

Spacer

A classe Spacer existe para que você possa especificar uma distância (altura e largura) entre os componentes gráficos. Bem simples.

Olhe o código abaixo e veja a simplicidade. É só especificar uma altura e largura no construtor e pronto!

public class SpacerExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private StringItem si1, si2;
	private Spacer mySpacer;

	public SpacerExemplo()
	{
		display = Display.getDisplay(this);

		si1 = new StringItem("si1", "String item 1");
		si2 = new StringItem("si2", "String item 2");

                // 0 pixels na horizontal e 20 pixels na vertical</strong>
		mySpacer = new Spacer(0, 20);

		myForm = new Form("Spacer");
		myForm.append(si1);
		myForm.append(si2);
		myForm.append(mySpacer); // adicione o Spacer por último!</strong>
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException
	{
		// nada aqui
	}

	protected void pauseApp()
	{
		// nada aqui
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}
Pequeno espaçamento entre os dois StringItems

Pequeno espaçamento entre os dois StringItems

TextField

Classe utilizada para a entrada de texto. Ela pode conter algumas restrições, como a entrada somente de texto, somente de números, texto com números etc. TextFiled também permite que o texto seja formatado automaticamente através do uso de algumas constantes. Você também pode utilizar uma combinação de constantes com formatações com a utilização do operador | .

Olhando o código abaixo isso ficará mas evidente.

public class TextFieldExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private TextField simpleTextField;
	private TextField restrictedTextField;
	private TextField formatedTextField;
	private TextField mixedTextField;

	public TextFieldExemplo()
	{

		display = Display.getDisplay(this);

		simpleTextField = new TextField("Simples", "", 30, TextField.ANY);

		restrictedTextField = new TextField("Restricted", "", 30, TextField.NUMERIC);

		formatedTextField = new TextField("Formated", "", 35, TextField.EMAILADDR);

		mixedTextField = new TextField("Mixed", "", 30,
				TextField.SENSITIVE | TextField.PASSWORD);

		Item[] items = new Item[] {simpleTextField, restrictedTextField,
				formatedTextField, mixedTextField};

		myForm = new Form("Exemplos de TextField", items);
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException
	{
		// nada aqui
	}

	protected void pauseApp()
	{
		// nada aqui
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}

Exemplos de TextField

Exemplos de TextField

Observe que no construtor de um TextField são passados quatro parâmetros: um rótulo (Label), um texto inicial quando o TextField for iniciado, o número máximo de caracteres armazenados no TextField e o tipo restrições e formatações aceitas.

DateField

Utilizando essa classe você pode obter do usuários entradas no formato de data e/ou hora, especificando que modo de entrada (input mode), que pode ser DATE, TIME ou DATE_TIME.

public class DateFieldExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private DateField calendar;
	private DateField currentDate;

	public DateFieldExemplo()
	{
		display = Display.getDisplay(this);

		calendar = new DateField("Calendario", DateField.DATE_TIME);

		currentDate = new DateField("Data atual", DateField.DATE);
		currentDate.setDate(new Date());

		myForm = new Form("Date Field");
		myForm.append(calendar);
		myForm.append(currentDate);
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException
	{
		// nada aqui
	}

	protected void pauseApp()
	{
		// nada aqui
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}
DateField inicial

DateField inicial

Escolhendo uma hora pelo DateField

Escolhendo uma hora pelo DateField

Escolhendo uma data

Escolhendo uma data

Gauge

Representa um intervalo entre números inteiros, geralmente zero (0) e algum número máximo pré-definido. Ela pode ser interativa ou apenas mostrar informações sem qualquer tipo de interação.

Essa classe é como uma espécie de marcador ou controle analógico. Geralmente quando você vai aumentar o volume do seu celular ela está lá, lembra?

public class GaugeExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private Gauge interactiveGauge;
	private Gauge staticGauge;

	public GaugeExemplo()
	{
		display = Display.getDisplay(this);

		interactiveGauge = new Gauge("Interativo", true, 10, 0);

		staticGauge = new Gauge("Estático", false, 8, 5);

		Item[] items = new Item[] {interactiveGauge, staticGauge};

		myForm = new Form("Gauge", items);
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException
	{
		// nada aqui.
	}

	protected void pauseApp()
	{
		// nada aqui.
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}
Exemplos de Gauge interativo e estático

Exemplos de Gauge interativo e estático

O construtor da classe recebe quatro parâmetros: um rótulo, um valor boolean para definir se ela será interativa (true) ou não (false), um valor máximo e um valor inicial.

ChoiceGroup

Permite mostrar listas de escolha para o usuário. Essas listas podem tomar a forma de Radio Buttons, Check Boxes ou Pop-up, dependendo dos parâmetros passados ao construtor da classe.

Quando instanciamos um ChoiceGroup podemos escolher entre os sequintes tipos:

  • EXCLUSIVE: apenas um item pode ser selecionado por vez, mas vários itens serão mostrados. A lista toma forma de Radio Buttons.
  • MULTIPLE: zero ou mais itens podem ser selecionados de uma vez. A lista toma forma de Check Boxes.
  • POP-UP: apenas um elemento é selecionado e apenas o elemento selecionado é mostrado. A lista toma forma de de um Pop-up.

Você também pode especificar imagens para cada item da lista, mas não iremos mostrar isso agora. Irei falar em outro post sobre imagens e a classe ImageItem que necessitam de uma atenção especial.

Para adicionar elementos a uma lista você utiliza o método append(String stringPart, Image imagePart) em que o primeiro parâmetro é o nome do elemento da lista e o segundo é uma imagem vinculada a esse elemento. Olhe o código abaixo e tudo ficará mais claro.

public class ChoiceGroupExemplo extends MIDlet
{

	private Display display;
	private Form myForm;
	private ChoiceGroup exclusiveCG;
	private ChoiceGroup multipleCG;
	private ChoiceGroup popupCG;

	public ChoiceGroupExemplo()
	{
		display = Display.getDisplay(this);

		exclusiveCG = new ChoiceGroup("Exclusive", ChoiceGroup.EXCLUSIVE);

		// adicionando elementos à lista
		exclusiveCG.append("Choice 1", null);
		exclusiveCG.append("Choice 2", null);
		exclusiveCG.append("Choice 3", null);
		exclusiveCG.append("Choice 4", null);

		multipleCG = new ChoiceGroup("Multiple", ChoiceGroup.MULTIPLE);

		// adicionando elementos à lista
		multipleCG.append("Choice 1", null);
		multipleCG.append("Choice 2", null);
		multipleCG.append("Choice 3", null);
		multipleCG.append("Choice 4", null);

		popupCG = new ChoiceGroup("Pop-up", ChoiceGroup.POPUP);

                popupCG.append("Choice 1", null);
		popupCG.append("Choice 2", null);
		popupCG.append("Choice 3", null);
		popupCG.append("Choice 3", null);

		Item[] items = new Item[] {exclusiveCG, multipleCG, popupCG};

		myForm = new Form("ChoiceGroup", items);
	}

	protected void destroyApp(boolean unconditional)
			throws MIDletStateChangeException
	{
		// nada aqui.
	}

	protected void pauseApp()
	{
		// nada aqui.
	}

	protected void startApp() throws MIDletStateChangeException
	{
		display.setCurrent(myForm);
	}

}
Exemplos de ChoiceGroup

Exemplos de ChoiceGroup

Aí estão algumas das classes de GUI mais utilizadas em Java ME. Espero que essa pequena introdução tenha ajudado. Para um melhor proveito, tentem modificar os códigos apresentados e façam testes, mudem métodos e observem como os MIDlets se comportam.

A API completa da classe Item e das suas subclasses pode ser encontrada no link abaixo:

http://java.sun.com/javame/reference/apis/jsr118/

Foi mostrado o básico de StringItem, Spacer, TextField, DateField, Gauge e ChoiceGroup. Ainda faltaram ImageItem e CustomItem. No próximo post irei falar sobre ImageItem e deixarei CustomItem um pouco de lado, pois estou apenas fazendo uma breve introdução à Java ME. As classes de GUI CLDC serão melhor exploradas após conhecer algo que irá transformar o modo de interagir com seus MIDlets: Commans.

Até a próxima. 😉

Referências:

[1] Beginning Java ME Platform.

Anúncios