Componet Es

Download as pdf or txt
Download as pdf or txt
You are on page 1of 41

Exemplos:

// Scribble1.java - Modelo de tratamento de eventos 1.1

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Scribble1 extends Applet


implements MouseListener, MouseMotionListener {
private int x, y;
Graphics g;

public void init() {


g = getGraphics();
addMouseListener(this);
addMouseMotionListener(this);
}
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
public void mouseDragged(MouseEvent e) {
int x1= e.getX();
int y1= e.getY();
g.drawLine(x, y, x1, y1);
x = x1; y = y1;
}
// Metodos nao usados do interface MouseListener:
public void mouseReleased(MouseEvent e) {};
public void mouseClicked(MouseEvent e) {};
public void mouseEntered(MouseEvent e) {};
public void mouseExited(MouseEvent e) {};
// Metodos nao usados do interface MouseMotionListener:
public void mouseMoved(MouseEvent e) {};
}

// Scribble2.java - Objectos listeneres (2) pertencem a classes internas

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Scribble2 extends Applet {


private int x, y;

public void init() {


addMouseListener(new ListenerMA());
addMouseMotionListener(new ListenerMMA());
}

146
class ListenerMA extends MouseAdapter {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
}
class ListenerMMA extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
int x1= e.getX();
int y1= e.getY();
g.drawLine(x, y, x1, y1);
x = x1;
y = y1;
}
}

// Scribble3.java - Objectos listeneres (2) pertencem a classes internas anónimas

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Scribble3 extends Applet {


private int x, y;

public void init() {


addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
int x1= e.getX();
int y1= e.getY();
g.drawLine(x, y, x1, y1);
x = x1;
y = y1;
}
});
}
}

147
// Scribble4.java - Pode-se alterar a visibilidade do applet

import java.applet.*; import java.awt.*; import java.awt.event.*;


import java.util.Vector;

public class Scribble4 extends Applet {


private int x, y;
Vector linhas = new Vector(100, 100);
Vector linCorrente;

public void init() {


addMouseListener(new ListenerMA());
addMouseMotionListener(new ListenerMMA());
}

class ListenerMA extends MouseAdapter {


public void mousePressed(MouseEvent e) {
linCorrente = new Vector(100, 100);
linhas.addElement(linCorrente);
linCorrente.addElement( new Point(e.getX(), e.getY()));
}
}

class ListenerMMA extends MouseMotionAdapter {


public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
int x1= e.getX(); int y1= e.getY();
Point p = (Point) linCorrente.lastElement();
g.drawLine(p.x, p.y, x1, y1);
linCorrente.addElement(new Point(x1,y1));
}
}

public void paint(Graphics g) {


for (int j=0; j < linhas.size(); j++) {
linCorrente = (Vector) linhas.elementAt(j);
Point p = (Point) linCorrente.elementAt(0);
for (int i=1; i<linCorrente.size(); i++) {
Point p1 = (Point) linCorrente.elementAt(i);
g.drawLine(p.x, p.y, p1.x, p1.y);
p = p1;
}
}
}
}

148
Componentes Gráficos

1. Label
Label –string de texto não editável utilizada normalmente como legenda ou título para
outros elementos gráficos

Construtores:

Label() cria um label vazio.


Label(String s) cria um label com a string passada como parâmetro.
Label(String s, int alignment) cria um label com a string passada como parâmetro e o
alinhamento especificado que pode ser um dos seguintes
valores: Label.LEFT, Label.CENTER, ou
Label.RIGHT.

Métodos que permitem obter os parâmetros de um label ou modificá-los:

String getText() retorna o texto do Label.


void setText(String s) coloca o texto do Label.
void setAlignment(int alignment) coloca o alinhamento em:
Label.LEFT, Label.CENTER, ou Label.RIGHT.

Por omissão, um label alinha o texto no seu interior à esquerda.

Para criar um objecto label pode-se utilizar o seguinte código:

Label etiqueta; // cria uma variável.


etiqueta = new Label(“Texto1”); // cria uma instância da classe Label.
add(etiqueta); // método da classe Container que adiciona o label ao container.

ou simplesmente o seguinte:

add( new Label(“Texto1”)); // cria uma instância da classe Label e adiciona-a ao applet

O label é um componente que não gera eventos.

2. Button
Button – componente de interface com o utilizador que quando pressionado (ou
seleccionado) com o rato desencadeia (“trigger”) uma determinada acção. Um
botão gera um evento quando o utilizador clica o botão com o rato.

Construtores:

Button() - cria um botão sem label.


Button(String s) - cria um botão com o label indicado no parâmetro.

149
Métodos que permitem obter os parâmetros de um botão ou modificá-los:

String getLabel() - retorna o label do botão ou “null” se não possuir label.


void setLabel(String s) - altera o label do botão para o valor do argumento especificado.

Tratamento de Eventos

Os eventos que ocorrem nos componentes gráficos de interface com o utilizador,


permitem que o applet ou a aplicação reajam a entradas (“input”) do utilizador.
Por exemplo, os botões usam eventos de acção que são desencadeados quando o botão é
premido, não sendo necessário preocuparmo-nos com os eventos “mouse down”, e
“mouse up”, nem onde estes eventos ocorrem desde que se prima e liberte o botão do
rato em cima do componente gráfico botão.

Exemplo:

/* Construa uma applet com dois botões, iniciar e incrementar, para inicializar ou
incrementar o valor de um contador mostrado num label. */

import java.awt.*;
import java.awt.event.*;

public class Contador extends java.applet.Applet {


Button incr, iniciar;
Label mostra;
int conta=0;

public void init() {


add(iniciar = new Button("Iniciar"));
add(incr = new Button("Incrementar"));
add(mostra = new Label(" "+0));
incr.addActionListener(new TrataEv());
iniciar.addActionListener(new TrataEv());
}

class TrataEv implements ActionListener {


public void actionPerformed(ActionEvent e) {
Object botao = e.getSource();
if (botao == incr) conta++;
else if (botao.equals(iniciar)) conta = 0;
mostra.setText(" "+conta);
}
}
}

150
/* Construa uma applet que crie 3 botões. Cada botão muda a cor do fundo do applet
para a cor designada no respectivo label. */

import java.awt.*;
import java.awt.event.*;

public class Cores extends java.applet.Applet {


Button verm, azul, verde;

public void init() {


setBackground(Color.white);
verm = new Button("Vermelho"); add(verm);
verm.addActionListener(new ProcessaBotao(Color.red));
azul = new Button("Azul"); add(azul);
azul.addActionListener(new ProcessaBotao(Color.blue));
verde = new Button("Verde"); add(verde);
verde.addActionListener(new ProcessaBotao(Color.green));
}

class ProcessaBotao implements ActionListener {


Color cor;
ProcessaBotao(Color c) {
cor = c;
}
public void actionPerformed(ActionEvent e) {
setBackground(cor);
}
}
}

151
3. Checkbox
Checkbox – componente gráfica de interface com o utilizador que tem 2 estados:
checked ou unchecked (true ou false). Ao contrário dos botões, um
Checkbox geralmente não desencadeia acções directas nas interfaces com
o utilizador, mas é usado para indicar características opcionais de uma
outra acção.

Os Checkboxes podem ser usadas de 2 modos:

Não exclusivos: dado um conjunto de Checkboxes qualquer um pode ser seleccionado.


Exclusivas: dado um conjunto de Checkboxes só um pode ser seleccionado de cada
vez. Este tipo de Checkboxes designam-se por radio boxes.

Construtores dos Checkboxes não exclusivos:

Checkbox() - cria um Checkbox vazio, não seleccionado.


Checkbox(String s) - cria uma Checkbox tendo como label a string passada como
parâmetro, inicialmente não seleccionado.
Checkbox(String s, boolean state) - cria um Checkbox tendo como label a string
passada como parâmetro e está seleccionado ou
não conforme o valor do 2º argumento – só Java
1.1.

Métodos que permitem obter os parâmetros de um Checkbox ou modificá-los:

void setState(boolean state) coloca o estado do Checkbox no estado especificado no


parâmetro.
boolean getState() - retorna um valor booleano representando o estado do Checkbox.
void setLabel(String s) - coloca como label do Checkbox a string passada como
parâmetro.
String getLabel() - retorna o label da Checkbox ou “null” se não possuir label.

Exemplo:

Construa um applet que crie um textField com o texto "Observe a mudança de estilo da
fonte" e 2 checkboxes para mudar o estilo da fonte: um com o label "Bold" e outro com
o label "Italic".
Qualquer checkbox quando seleccionado deve resultar na aplicação desse estilo à fonte
do textField.

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Checkbox1 extends Applet {


Font f;
TextField t;
Checkbox bold, italic;

152
public void init() {
t = new TextField( "Observe a mudança de estilo da fonte" );
f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f ); add( t );
bold = new Checkbox( "Bold" ); italic = new Checkbox( "Italic" );
add( bold ); add( italic );
TrataEv t = new TrataEv();
bold.addItemListener(t); italic.addItemListener(t);
}

class TrataEv implements ItemListener {


public void itemStateChanged( ItemEvent e ) {
if (e.getSource() instanceof Checkbox) {
int valBold = ( bold.getState() ? Font.BOLD : Font.PLAIN );
int valItalic = ( italic.getState() ? Font.ITALIC : Font.PLAIN );
f = new Font( "TimesRoman", valBold + valItalic, 14 );
t.setFont( f );
}
}
}
}

4. Radio Buttons
Radio Buttons – componente gráfica de interface com o utilizador (GUI) constituído por
um grupo de botões onde só um botão no grupo pode estar
seleccionado. Seleccionando um qualquer botão força todos os outros
botões do grupo a passarem ao estado não seleccionado.

O nome “radio buttons” deriva dos antigos botões de selecção manual das estações de
rádio. Quando se pressionava um botão, todos os outros saltavam e ficavam não
seleccionados.

Para criar um conjunto de radio buttons é necessário criar primeiro uma instância da
classe CheckboxGroup:

CheckboxGroup cbg = new CheckboxGroup();

153
Em seguida criam-se radio buttons individuais, objectos da classe Checkbox, e
adicionam-se ao conjunto.
A criação de radio buttons individuais pertencentes a um determinado CheckboxGroup
é efectuada pelo método:

Checkbox(String s, boolean state, CheckboxGroup cbg)

Estes construtores criam um radio button com o label “s”, pertencente ao


CheckboxGroup cbg, e no estado seleccionado ou não conforme o valor do respectivo
argumento.

add(new Checkbox(“Yes”, cbg, true);


add(new Checkbox(“No”, cbg, false);

O último botão “true” a ser adicionado ao grupo será o seleccionado. Se por outro lado,
se criar um conjunto de botões todos não seleccionados, inicialmente aparecerão não
seleccionados.

Exemplo:

Construa um applet que crie um textField com o texto "Observe a mudança de fonte" e
um grupo de 3 "radio buttons" para mudar a fonte para “Courier” ou “TimesRoman” ou
“Helvetica”.

import java.awt.*;
import java.awt.event.*;

public class CheckboxGroup1 extends java.applet.Applet {


Font f;
TextField t;
CheckboxGroup cbg;
Checkbox courier, timesRoman, helvetica;

public void init() {


t = new TextField( "Observe a mudança de fonte" );
f = new Font( "TimesRoman", Font.PLAIN, 14 );
t.setFont( f );
add( t );
cbg = new CheckboxGroup();
add(courier = new Checkbox("Courier", cbg, false));
add(timesRoman = new Checkbox("TimesRoman", cbg, true));
add(helvetica = new Checkbox("Helvetica", cbg, false));
TrataEv t = new TrataEv();
courier.addItemListener(t);
timesRoman.addItemListener(t);
helvetica.addItemListener(t);
}

154
class TrataEv implements ItemListener {
public void itemStateChanged( ItemEvent e ) {
String fonte;
if (e.getSource() instanceof Checkbox) {
if (courier.getState()) fonte = "Courier";
else if (timesRoman.getState()) fonte = "TimesRoman";
else fonte = "Helvetica";
f = new Font(fonte, Font.PLAIN, 14 );
t.setFont( f );
}
}
}
}

5. TextField
TextField –campo de texto constituído por uma linha de texto na qual o utilizador pode
digitar texto a partir do teclado ou simplesmente usada para mostrar texto.

Quando o utilizador digita Enter num TextField um evento ACTION_EVENT é gerado


e o texto digitado pode ser usado no programa.

A classe TextField assim como a classe TextArea derivam da classe TextComponent


que por sua vez deriva da classe Component, a qual deriva directamente de Object.

Object

Component

TextComponent

TextField TextArea
155
Construtores:

TextField() - constrói um objecto textField vazio.


TextField(int cols) - constrói um objecto textField vazio com o número
especificado de colunas.
TextField(String s) - constrói um objecto textField inicializado com a string s.
TextField(String s, int cols)- constrói um objecto textField inicializado com a string s e
com o número especificado de colunas.

Métodos:

void setEchoChar(char c) - coloca o carácter “c” à medida que o utilizador digita no


textField. Útil para entrar passwords.

Métodos da classe TextComponent herdados pela classe TextField:

void setEditable(boolean b) - coloca o textField editável (true) ou não (false).


boolean isEditable() - retorna um valor booleano indicando se o campo de
texto é editável.
void setText(String s) - coloca o texto s no campo de texto.
String getText() - retorna a string do texto do campo de texto.
String getSelectedText() - retorna a string do texto seleccionado.
int getSelectionStart() - retorna a posição do primeiro carácter seleccionado
do campo de texto.
int getSelectionEnd() - retorna a posição do último carácter seleccionado do
campo de texto.
void select(int selectionStart, int selectionEnd) - efectua a selecção de texto entre os
limites especificados.
void selectAll() - selecciona todo o texto do campo de texto.

Exemplo:

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class TextField1 extends Applet {


TextField msg1, msg2, password;
String s;

public void init() {


s = "lp2";
msg1 = new TextField("Digite a password:");
msg1.setEditable(false);
password = new TextField(12);
password.setEchoChar('*');

156
msg2 = new TextField(30);
msg2.setEditable(false);
add(msg1);
add(password);
add(msg2);
password.addActionListener(new TrataEv());
}

public class TrataEv implements ActionListener {


public void actionPerformed(ActionEvent evt) {
if (evt.getSource() instanceof TextField)
if (evt.getSource() == password)
if (password.getText().equals(s))
msg2.setText("Acesso permitido");
else msg2.setText("Password invalida.");
}
}
}

6. TextArea
TextArea – área de edição de texto que pode ter mais que uma linha e scrollbars
horizontal e vertical.

Quando o utilizador digita Enter numa textArea um evento ACTION_EVENT é gerado


e o texto digitado pode ser usado no programa.

A classe TextArea assim como a classe TextField derivam da classe TextComponent.

Construtores:

TextArea() - constrói um objecto textArea vazio.


TextArea(int rows, int cols) - constrói um objecto textArea vazio com o número
de linhas e colunas especificado.
TextArea(String texto) - constrói um objecto textArea inicializado com o
texto especificado.
TextArea(String texto, int rows, int cols) - constrói um objecto textArea inicializado
com o texto, linhas e colunas especificados.

157
Métodos:

void appendText (String s) - acrescenta a string s ao texto existente na área de


texto.
void insertText (String s, int pos) - insere a string s, a partir da posição especificada,
ao texto existente na área de texto.
void replaceText (String s, int start, int end) - substitui a parte do texto, entre as
posições especificadas, pela string s.
void setColumns(int cols) - coloca o número de colunas no valor especificado.
void setRows(int rows) - coloca o número de linhas no valor especificado.
int getColumns() - retorna o número de colunas na área de texto.
int getRows() - retorna o número de linhas na área de texto.

Métodos da classe TextComponent herdados pela classe TextArea:

void setEditable(boolean b)
boolean isEditable()
void setText(String s)
String getText()
String getSelectedText()
int getSelectionStart()
int getSelectionEnd()
void select(int selStart, int selEnd)
void selectAll()

Exemplo:

Construa uma applet que crie dois textArea (com 5 linhas por 20 colunas visíveis) tendo
o primeiro algum texto.
Mostre através do incremento de um contador sempre que o texto é editado.
Um botão "copiar" deve permitir copiar o texto seleccionado para o 2.º TextArea.

import java.awt.*;
import java.awt.event.*;

public class TextArea1 extends java.applet.Applet {


private TextArea t1, t2;
private Button copiar;
private Label l;
private int cont;

public void init() {


setBackground(Color.white);
String s = "Texto para ilustrar o funcionamento de \n um objecto TextArea.";
t1 = new TextArea(s, 5, 20);
add(t1);
t1.addTextListener(new TrataEvText());
add(copiar = new Button("Copiar"));
copiar.addActionListener(new TrataEvAction());
t2 = new TextArea(5, 20);

158
add(t2);
add(l=new Label(" 0"));
}

class TrataEvAction implements ActionListener {


public void actionPerformed(ActionEvent e) {
t2.setText(t1.getSelectedText());
}
}

class TrataEvText implements TextListener {


public void textValueChanged(TextEvent e) {
cont ++;
l.setText(" " + cont);
}
}
}

7. Choice
Choice lists – componentes que mostram uma lista de itens permitindo a selecção de
apenas um.

Para criar uma “choice list” é necessário criar um objecto da classe Choice e em seguida
adicionar os elementos da lista a esse objecto.

Construtor:

Choice() - constrói um objecto da classe Choice.

Métodos:
void add (String s) - adiciona um item à choice list.
int countItems () - retorna o número de elementos da choice list.
String getItem(int pos) - retorna a string correspondente ao item especificado.
void select (int pos) - coloca o respectivo item seleccionado.
void select (String s) - coloca o respectivo item seleccionado.
int getSelectedIndex() - retorna o índice correspondente ao item seleccionado.
String getSelectedItem() - retorna a string correspondente ao item seleccionado.

159
Exemplo:

Construa um applet que crie um textField com o texto "Observe a mudança de fonte" e
um choice com 3 itens para mudar a fonte para “Courier” ou “TimesRoman” ou
“Helvetica”.

import java.awt.*;
import java.awt.event.*;

public class Choice1 extends java.applet.Applet {


Font f;
TextField t;
Choice fontes;

public void init() {


t = new TextField( "Observe a mudança de fonte", 30 );
f = new Font( "TimesRoman", Font.PLAIN, 14 ); t.setFont( f );
add( t );
fontes = new Choice();
fontes.add("Courier");
fontes.add("TimesRoman");
fontes.add("Helvetica");
add(fontes);
fontes.addItemListener(new TrataEv());
}

class TrataEv implements ItemListener {


public void itemStateChanged( ItemEvent e ) {
String fonte;
if (e.getSource() instanceof Choice) {
Choice c = (Choice) e.getSource();
fonte = c.getSelectedItem();
f = new Font(fonte, Font.PLAIN, 14 );
t.setFont( f );
}
}
}
}

160
8. List
Scrolling List – é uma lista de itens dos quais apenas uma quantidade fixa é mostrada,
permitindo efectuar scrolling com scrollbar se necessário.
Uma scrolling list pode permitir múltipla selecção.
Um único clique num item selecciona o item, se não estava seleccionado, ou coloca o
item não seleccionado se estava seleccionado.

Métodos:
String getSelectedItems() – retorna um array de Strings com os itens seleccionados.

Um duplo clique num item cria um evento de acção. No modelo de eventos 1.1 o evento
criado é do tipo ActionEvent e o método invocado é actionPerformed().

Exemplo:

Crie uma “scrolling list” com 10 nomes de países tendo apenas 5 visíveis, que permita
múltiplas selecções. Crie ainda um botão designado “Copiar >>>” e outra “scrolling
list” vazia com 5 itens visíveis.Quando pressionado o botão devem ser copiados os itens
seleccionados da 1.ª lista para a 2.ª.

mport java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class List1 extends Applet {


private List listaPaises, listaCopia;
private Button copiar;
private String paises[] = { "Portugal", "Espanha", "E.U.A", "Inglaterra",
"França", "Suíça", "Bélgica", "Holanda", "Alemanha", "China" };
public void init() {
listaPaises = new List( 5, true );
for ( int i = 0; i < paises.length; i++ )
listaPaises.add( paises[ i ] );
add( listaPaises );
copiar = new Button( "Copiar >>>" );
add( copiar );
copiar.addActionListener(new TrataEv());
listaCopia = new List( 5, false );
add( listaCopia );
}

class TrataEv implements ActionListener {


public void actionPerformed( ActionEvent e) {
String paisesC[];
if (e.getSource() == copiar) {
paisesC = listaPaises.getSelectedItems();
for ( int i = 0; i < paisesC.length; i++ )
listaCopia.add( paisesC[ i ] );

161
}
}
}
}

Gestores de Posicionamento (Layout Manager)


A forma como os componentes gráficos são colocados numa janela é controlada por um
objecto designado gestor de posicionamento (“layout manager”). Antes de adicionar
componentes gráficos a um objecto contentor (janela ou outros componentes gráficos
contentores) deve-se instalar (nesse objecto contentor) um objecto gestor de
posicionamneto. No entanto, como qualquer objecto contentor possui um determinado
gestor de posicionamento por omissão, é possível adicionar componentes gráficos a um
objecto contentor sem instalar um gestor de posicionamento, sendo nesse caso os
componentes dispostos pelo gestor de posicionamento definido por omissão para esse
contentor.
A disposição dos componentes para a maior parte dos gestores é baseada na ordem pela
qual os componentes são adicionados. Os gestores de posicionamento adaptam a
disposição dos componentes às dimensões do applet ou da janela da aplicação. Se as
dimensões da janela mudam, o tamanho, forma e colocação dos componentes pode
mudar.

As classes Applet e Frame são subclasses da classe Container. O método setLayout() da


classe Container permite instalar um gestor de posicionamento.

FlowLayout
Este é o gestor de posicionamento por omissão para os applets. Corresponde a colocar
os componentes fluindo da esquerda para a direita até que a linha de cima esteja cheia,
depois passa para a linha seguinte continuando o fluxo de colocação dos componentes,
do mesmo modo que as palavras de um texto numa página.
Com FlowLayout os componentes tomam um tamanho natural, por exemplo, um botão
terá o tamanho da string que constitui a respectiva etiqueta.

162
Para criar um gestor de posicionamento para um contentor é necessário criar uma
instância de uma classe gestor de posicionamento (“layout manager”), e torná-lo o
gestor do contentor com o método setLayout() da classe Container:

FlowLayout fl = new FlowLayout();


setLayout(fl);

Para um contentor applet (objecto da classe Applet) ou para um contentor panel (objecto
da classe Panel que estudaremos adiante) o gestor de posicionamento por omissão é
FlowLayout.

Construtores:

FlowLayout() - os componentes gráficos são alinhados ao centro.


FlowLayout(int align) - define uma das três possíveis formas de alinhamento dos
componentes: FlowLayout.CENTER, FlowLayout.LEFT
ou FlowLayout.RIGHT.
FlowLayout(int align, int hgap, int vgap) - define o tipo de alinhamento, o espaçamento
horizontal e o espaçamento vertical entre os componentes
gráficos.

Exemplo:

import java.awt.FlowLayout;
import java.awt.Button;
import java.awt.Color;
import java.applet.Applet;

public class FlowLayout1 extends Applet {


Button b1 = new Button(“Um”);
Button b2 = new Button(“Dois”);
FlowLayout fl = new FlowLayout();

public void init() {


setBackgroud(Color.white);
setLayout(fl);
add(b1);
add(b2);
}
}

163
GridLayout
O gestor de posicionamento GridLayout divide o Container numa grelha com um dado
número de linhas e de colunas e coloca os componentes da esquerda para a direita e de
cima para baixo à medida que são adicionados. Para saltar células podem-se colocar
componentes invisiveis, tais como new Label(“”) ou new Panel().

Com GridLayout os componentes enchem o espaço disponível para eles em cada célula.

Construtores:

GridLayout(int rows, int cols) - cria um gestor de posicionamento especificando o


número de linhas e o número de colunas.

GridLayout(int rows, int cols, int hgap, int vgap) - cria um gestor de posicionamento
especificando o número de linhas, o número de
colunas, o espaçamento horizontal e vertical entre
os componentes gráficos.

Exemplo:

import java.awt.GridLayout;
import java.awt.Button;
import java.awt.Color;
import java.applet.Applet;

public class GridLayout1 extends Applet {


Button b1 = new Button("1");
Button b2 = new Button("2");
Button b3 = new Button("3");
Button b4 = new Button("4");
Button b5 = new Button("5");
Button b6 = new Button("6");
Button b7 = new Button("7");
Button b8 = new Button("8");
Button b9 = new Button("9");
Button b0 = new Button("0");
GridLayout gl = new GridLayout(4, 3, 10, 10);

public void init() {


setBackground(Color.white);
setLayout(gl);
add(b1); add(b2); add(b3); add(b4); add(b5);
add(b6); add(b7); add(b8); add(b9); add(b0);
}
}

164
BorderLayout
O gestor de posicionamento BorderLayout divide o Container em 5 secções: norte, sul,
este, oeste e centro. Os componentes são adicionados usando uma chamada do método
add() da classe Container diferente dos anteriores:

add( String nome, Component comp);

O primeiro argumento é uma string indicando que parte do BorderLayout é atribuída ao


componente. O primeiro argumento pode ter 5 valores possíveis: “North”, “South”,
“East”, “West” e “Center”.

Construtores:

BorderLayout() - cria um gestor de posicionamento com os


espaçamentos standard entre os componentes.
BorderLayout(int hgap, int vgap) - cria um gestor de posicionamento com os
espaçamentos horizontais e verticais especificados.

Exemplo:

import java.applet.Applet;
public class BorderLayout1 extends Applet {
Button norte= new Button("Célula Norte");
Button sul = new Button("Célula Sul");
Button este = new Button("Célula Este");
Button oeste = new Button("Célula Oeste");
Button centro = new Button("Célula Centro");
BorderLayout bl = new BorderLayout(3, 3);

public void init() {


setBackground(Color.white);
setLayout(bl);
add("North", norte);
add("South", sul);

165
add("East", este);
add("West", oeste);
add("Center", centro);
}
}

As secções norte e sul estendem-se do limite esquerdo ao limite direito do contentor e


têm uma altura dependente do componente adicionado. As secções oeste e este têm uma
largura dependente dos componentes adicionados, e a secção centro ocupa todo o
espaço central. A cada secção só se pode adicionar um componente gráfico. A zona
centro espande-se pelas secções vazias (sem componentes adicionados).

Panel
Um painel é um contentor que fornece espaço para agrupar componentes e tem o seu
próprio gestor de posicionamento (layout manager). É uma estrutura invisível mas
essencial para obter uma boa apresentação de um interface, devido ao facto de se poder
escolher um gestor de posicionamento para o painel permitindo a adição de outros
componentes gráficos ao painel e em seguida inserir o painel num contentor (sendo a
posição do painel determinada pelo gestor de posicionamneto do contentor).
Abreviadamente pode-se inserir painéis no interior dos layouts e layouts dentro de
painéis. Ainda é possível misturar painéis e outros componentes dispostos por um
mesmo gestor de posicionamento num contentor.

O gestor de posicionamento por omissão para um painel é o gestor FlowLayout. Os


componentes devem ser colocados no painel antes dele ser posto num contentor maior.

Um painel é um contentor que não tem a sua própria janela – tem de estar contido
dentro de outro qualquer contentor

Exemplo de construção de um painel, colocação de gestor de posicionamento e


adicionamento de dois botões:

166
BorderLayout bl = new BorderLayout();
Panel p = new Panel();
p.setLayout(bl);
Button botão1= new Button(“Botão 1”);
Button botão2= new Button(“Botão 2”);
p.add(“North”, botão1);
p.add(“Center”, botão2);

Há 4 classes usadas normalmente para contentores:

Frame - é uma janela do nível mais alto que pode conter uma barra de menus, um
cursor e ícone próprios.
Dialog - é uma janela de diálogo.
Panel - é um contentor sem janela própria.
Applet - é uma janela.

Ao contrário de dialog e frame, panel é um contentor que não cria uma janela separada
própria, tem de estar contido dentro de outro contentor.
Panel é adequado para conter porções de um interface maior dentro de um frame, ou
dialog ou dentro de outro panel.

CardLayout
É um gestor de posicionamento em que os componentes são mostrados um de cada vez.
Só um cartão (“card”) é visível estando os outros escondidos.

Muitas vezes este gestor de posicionamento é usado criando um painel para cada cartão.
Neste caso é necessário, em primeiro lugar, adicionar alguns componentes a cada painel
(usando qualquer gestor de posicionamento) e só depois os painéis são adicionados ao
contentor (container) que usa o gestor de posicionamento CardLayout.

A mudança de cartão visível só pode ser desencadeada pelo programa. No entanto a


acção do utilizador noutro componente gráfico, pode desencadear no programa a acção
de mudar o cartão visível.

Com este gestor obtém-se a possibilidade de ter diferentes “forms” que podem surgir
(“pop up”) comandadas pelo programa.

Exemplo de CardLayout e Panel

Construa um applet contendo 3 objectos gráficos (botões) dispostos pelo gestor


CardLayout. Para efectuar a mudança de cartão visível crie também 3 botões que
quando pressionados tornam visível o respectivo cartão.

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

167
public class CardLayoutTest extends Applet {
Button primeiro = new Button("Primeiro"),
segundo = new Button("Segundo"),
terceiro = new Button("Terceiro");
Panel p2;
CardLayout cl;

public void init() {


setLayout(new BorderLayout());
Panel p1 = new Panel();
p1.setLayout(new FlowLayout());
p1.add(primeiro);
p1.add(segundo);
p1.add(terceiro);
add("North", p1);
TrataEv t = new TrataEv();
primeiro.addActionListener(t);
segundo.addActionListener(t);
terceiro.addActionListener(t);

p2 = new Panel();
p2.setLayout(cl=new CardLayout());
p2.add("Primeiro cartão", new Button("O primeiro cartão"));
p2.add("Segundo cartão", new Button("O segundo cartão"));
p2.add("Terceiro cartão", new Button("O terceiro cartão"));
add("Center", p2);
}

class TrataEv implements ActionListener {


public void actionPerformed(ActionEvent evt) {
if (evt.getSource().equals(primeiro))
cl.first(p2);
else if (evt.getSource().equals(segundo)) {
cl.first(p2);
cl.next(p2);
}
else if (evt.getSource().equals(terceiro))
cl.last(cartões);
}
}
}

168
Canvas
Um componente canvas representa uma área rectangular do ecrã na qual uma aplicação
pode desenhar ou a partir da qual a aplicação pode capturar eventos do utilizador.
Canvas é uma área de desenho que pode receber eventos. A classe Canvas herda da
classe Componente.

Construtor: public Canvas() - cria um objecto canvas.


Métodos: public void paint(Graphics g)

Se pretendermos usar o método paint() num objecto da classe Canvas, temos de criar
uma subclasse de Canvas para reescrever o método paint(). Nestes casos uma aplicação
deve criar uma subclasse de Canvas para obter funcionalidade útil (reescrevendo o
método paint() para realizar operações gráficas) e criar componentes próprios.
No entanto, o exemplo que apresentamos a seguir não necessitou de criar uma subclasse
de Canvas porque não usa o método paint().
Desenhar num objecto canvas realiza-se a partir do canto superior esquerdo do canvas.

Exemplo de Canvas

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class CanvasTest extends Applet {


BorderLayout bl = new BorderLayout();
Label l = new Label("Sarrabiscos");
Canvas c = new Canvas();
int x, y;
Graphics g;

public void init() {


setLayout(bl);
add("North", l);
add("Center", c);
c.setBackground(Color.yellow);
c.addMouseListener(new ListenerMA());
c.addMouseMotionListener(new ListenerMMA());
g = c.getGraphics();
}

class ListenerMA extends MouseAdapter {


public void mousePressed(MouseEvent evt) {
x = evt.getX();
y = evt.getY();
}
}

169
class ListenerMMA extends MouseMotionAdapter {
public void mouseDragged(MouseEvent evt) {
int x1 = evt.getX();
int y1 = evt.getY();
g.drawLine(x, y, x1, y1);
x = x1;
y = y1;
}
}
}

Os métodos de desenho (neste exemplo drawLine()) são chamados no objecto da classe


Graphics e não no objecto canvas, porque o objecto da classe Graphics enviado ao
método paint() (não usado neste exemplo), assim como o retornado por getGraphics()
contem o contexto gráfico do componente e portanto trata de todas as operações de
desenho que têm lugar nesse componente.
Como os objectos listeners estão registados no componente canvas as coordenadas onde
ocorrem os eventos sõ relativas ao canto superior esquerdo do componente canvas. A
acção dos métodos mousePressed() e mouseDragged() devem aplicar-se ao contexto
gráfico do objecto Canvas para funcionarem apenas no objecto c (canvas). Se fossem
aplicados globalmente actuariam sobre toda a janela do applet.

Exemplo de Panel e Canvas

Construa um applet que apresente 3 formas (instrumentos) de desenho: “Linha”,


“Rectângulo” e “Oval”, uma palette de 6 cores: “Preto”, “Branco”, “Vermelho”, “Azul”,
“Verde” e “Amarelo” e uma área de desenho onde arrastando o rato pode desenhar
linhas, rectângulos ou ovais de uma qualquer das cores da palette conforme o
instrumento de desenho e cor previamente seleccionados.

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

170
public class Desenhar extends Applet {
Panel instrumentos, palette;
Button linha, rect, oval;
Button preto, branco, vermelho, azul, verde, amarelo;
Canvas1 areaDesenho;

public void init() {


setLayout(new BorderLayout());
palette = new Panel();
palette.setLayout(new GridLayout(2,3,5,5));
preto = new Button("Preto");
branco = new Button("Branco");
vermelho = new Button("Vermelho");
azul = new Button("Azul");
verde = new Button("Verde");
amarelo = new Button("Amarelo");
palette.add(preto); palette.add(branco);
palette.add(vermelho); palette.add(azul);
palette.add(verde); palette.add(amarelo);
add("South", palette);
TrataEv t = new TrataEv();
preto.addActionListener(t); branco.addActionListener(t);
vermelho.addActionListener(t); azul.addActionListener(t);
verde.addActionListener(t); amarelo.addActionListener(t);
instrumentos = new Panel();
instrumentos.setLayout(new GridLayout(3,1,5,5));
linha = new Button("Linha");
rect = new Button("Rectângulo");
oval = new Button("Oval");
instrumentos.add(linha);
instrumentos.add(rect);
instrumentos.add(oval);
add("West", instrumentos);
linha.addActionListener(t);
rect.addActionListener(t);
oval.addActionListener(t);
areaDesenho = new Canvas1(Color.black, 0);
add("Center", areaDesenho);
validate();
}

class TrataEv implements ActionListener {


public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == linha) areaDesenho.instr = 0;
if (source == rect) areaDesenho.instr = 1;
if (source == oval) areaDesenho.instr = 2;
if (source == preto) areaDesenho.cor = Color.black;
if (source == branco) areaDesenho.cor = Color.white;
if (source == vermelho) areaDesenho.cor = Color.red;

171
if (source == azul) areaDesenho.cor = Color.blue;
if (source == verde) areaDesenho.cor = Color.green;
if (source == amarelo) areaDesenho.cor = Color.yellow;
}
}
}

class Canvas1 extends Canvas {


Color cor;
int instr;
int x, y, x1, y1;

public Canvas1(Color c, int inst) {


cor = c;
instr = inst;
addMouseListener(new ListenerMA());
addMouseMotionListener(new ListenerMMA());
}

class ListenerMA extends MouseAdapter {


public void mousePressed(MouseEvent evt) {
x = evt.getX();
y = evt.getY();
}
}

class ListenerMMA extends MouseMotionAdapter {


public void mouseDragged(MouseEvent evt) {
x1 = evt.getX();
y1 = evt.getY();
repaint();
}
}

public void paint(Graphics g) {


g.setColor(cor);
if (instr == 0) g.drawLine(x, y, x1, y1);
else if (instr == 1) g.fillRect(x, y, x1-x, y1-y);
else if (instr == 2) g.fillOval(x, y, x1-x, y1-y);
}
}

172
Os métodos mousePressed, mouseDragged e paint devem aplicar-se ao contexto gráfico
do objecto Canvas1 para funcionarem apenas no objecto areaDesenho. Se estivessem
definidos globalmente actuariam sobre toda a janela do applet.

Frame
Um frame é uma janela do nível mais alto com um título e um bordo. Um frame pode
ter uma barra de menus.

Construtores:
public Frame() - constrói um frame inicialmente invisível e sem título.
public Frame(String título) - constrói um frame inicialmente invisível e com o título
especificado.

Métodos:
public void setTitle(String título) - coloca o título deste frame no título especificado.
public String getTitle() - retorna o título do frame ou null se o frame não tem título.

Exemplo de criação de um frame a partir de um applet

public class AppletFrame extends java.applet.Applet {


Frame window;

public void init() {


Button b1 = new Button("Open Window");
Button b2 = new Button("Close Window");
add(b1);
add(b2);
b1.addActionListener(new TrataEv(true));
b2.addActionListener(new TrataEv(false));

window = new Frame("Uma janela solta");


window.setLayout(new BorderLayout());

173
Label l = new Label("Isto é uma janela", Label.CENTER);
l.setFont(new Font("TimesRoman", Font.PLAIN, 14));
window.add("Center", l);
window.setSize(150,150);
window.show();
}

class TrataEv implements ActionListener {


boolean mostrar = true;

public TrataEv(boolean m) {
mostrar = m;
}

public void actionPerformed(ActionEvent evt) {


if (evt.getSource() instanceof Button) {
if (mostrar) {
if (!window.isShowing()) window.show();
} // necessario estas chavetas - porquê ?
else if (window.isShowing()) window.hide();
}
}
}
}

Criação de Aplicações com Interface Gráfico com o Utilizador


(GUI – Graphical user Interface)

São poucas as diferenças entre um applet Java e uma aplicação gráfica para além do
ambiente em que cada um corre. Os métodos gráficos, os componentes de interface com
o utilizador, eventos, janelas e caixas de diálogo podem ser usados do mesmo modo em
aplicações Java como em applets.
As aplicações têm a vantagem de não estarem sujeitas às restrições dos applets.

174
Para criar uma aplicação gráfica Java, geralmente a classe principal da aplicação é uma
subclasse de Frame. Dentro do método main() da aplicação cria-se uma nova (new)
instância da classe (subclasse de Frame), o que nos dá uma nova janela AWT, a qual
podemos redimensionar (setSize()) e tornar visível (show()) de um modo idêntico a
qualquer janela AWT.
Dentro do método construtor desta classe deve-se colocar o título, adicionar o gestor de
disposição, criar, configurar e adicionar componentes de um modo semelhante ao que se
fazia no método init() de um applet.

Exemplo de uma aplicação gráfica

Construa uma aplicação que crie 2 botões: um para iniciar e outro para incrementar um
contador cujo valor deve ser mostrado num label.

import java.awt.*;
import java.awt.event.*;

public class ApliContador extends Frame {


Button incr, iniciar;
Label mostra;
int conta=0;

public ApliContador(String titulo) {


super(titulo);
setLayout(new FlowLayout());
add(iniciar = new Button("Iniciar"));
add(incr = new Button("Incrementar"));
add(mostra = new Label(" "+0));
addWindowListener(new Terminator());
TrataEv t = new TrataEv();
incr.addActionListener(t);
iniciar.addActionListener(t);
}

class TrataEv implements ActionListener {


public void actionPerformed(ActionEvent e) {
Object botao = e.getSource();
if (botao == incr) conta++;
else if (botao.equals(iniciar)) conta = 0;
mostra.setText(" "+conta);
}
}

class Terminator extends WindowAdapter {


public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

175
public static void main(String args[]) {
ApliContador apl = new ApliContador("Aplicação Gráfica: Contador");
apl.setSize(300, 300);
apl.show();
}
}

Outros exemplos de aplicações gráficas:

import java.awt.*;
import java.awt.event.*;

public class Scribble5 extends Frame {


private int x, y;
public Scribble5() {
setTitle("Janela para Sarrabiscar");
setSize(300, 200);
addWindowListener(new Terminator());
addMouseListener(new ListenerMA());
addMouseMotionListener(new ListenerMMA());
}
class ListenerMA extends MouseAdapter {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
}
class ListenerMMA extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
int x1= e.getX(); int y1= e.getY();
g.drawLine(x, y, x1, y1);
x = x1; y = y1;
}
}
class Terminator extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

176
public static void main(String[] args) {
Frame jan = new Scribble15();
jan.show();
}
}

// Construa uma aplicacao que crie uma janela com 3 botões.


// Cada botão muda a cor do fundo da janela para a cor do respectivo label.

import java.awt.*;
import java.awt.event.*;

public class Cores3 extends Frame {


Button verm, azul, verde;
public Cores3() {
setTitle("Janela com Botoes");
setLayout(new FlowLayout());
setSize(300, 200);
addWindowListener( new Terminator());
setBackground(Color.white);
verm = new Button("Vermelho"); add(verm);
verm.addActionListener(new ProcessaBotao(Color.red));
azul = new Button("Azul"); add(azul);
azul.addActionListener(new ProcessaBotao(Color.blue));
verde = new Button("Verde"); add(verde);
verde.addActionListener(new ProcessaBotao(Color.green));
}

class ProcessaBotao implements ActionListener {


Color cor;
ProcessaBotao(Color c) { cor = c; }
public void actionPerformed(ActionEvent e) {
setBackground(cor);
}
}

class Terminator extends WindowAdapter {


public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

public static void main(String[] args) {


Frame jan = new Cores3();
jan.show();
}
}

177
Frame
Um frame é uma janela do nível mais alto com um título e um bordo. Um frame pode
ter uma barra de menus.

Construtores:
public Frame() - constrói um frame inicialmente invsível e sem título.
public Frame(String título) - constrói um frame inicialmente invisível e com o título
especificado.

Métodos:
void setTitle(String título) - coloca o título deste frame no título especificado.
String getTitle() - retorna o título do frame ou null se o frame não tem
título.
void setMenuBar(MenuBar mb) - coloca a barra de menus deste frame na barra de
menus especificada.
MenuBar getMenuBar() - retorna a barra de menus para este frame, ou null, se
o frame não tem uma barra de menus.
void setResizable(boolean resizable) – determina se este frame pode ser
redimensionável.
Por omissão um frame é redimensionável.
void isResizable(boolean resizable) – indica se este frame é redimensionável.
void remove(MenuComponent m) – remove a barra de menus especificada.

MenuBar (subclasse de MenuComponent)


Esta classe encapsula o conceito de plataforma de uma barra de menus ligada a um
frame. Para ligar uma barra de menus a um frame deve-se chamar o método
setMenuBar() da classe Frame.

Construtor:
public MenuBar() – cria uma nova barra de menus.

Métodos:

Menu add(Menu m) – adiciona o menu especificado à barra de menus. Retorna o menu


adicionado
int countMenus() – retorna o número de menus na barra de menus.
Menu getMenu(int i) – retorna o menu da barra de menus na posição especificada.
void remove(int index) – remove da barra de menus o menu localizado no índice
especificado.
void remove(MenuComponent m) – remove da barra de menus o menu especificado.

178
Menu
Um menu é um componente pull-down de uma barra de menus. Cada item num menu
pertence à classe MenuItem. Cada item pode ser uma instância de MenuItem, um
submenu (uma instância de Menu) ou um checkbox (uma instância de
CheckboxMenuItem).

Construtores:

public Menu(String label) – constrói um novo menu com o label especificado.


public Menu(String label, boolean tearoff) – constrói um novo menu com o label
especificado. Se o 2.º argumento é true
o menu permanece no ecrã depois do
rato ter sido libertado.

Métodos:

MenuItem add(MenuItem mi) – adiciona o item de menu especificado a este menu. Se o


item de menu é parte de outro menu, remove-o desse
menu. Retorna o item de menu adicionado.
void add(String label) – adiciona um item com o label especificado a este menu.
MenuItem getItem(int index) – retorna o item localizado no índice especificado deste
menu.
void remove(MenuComponent item) – apaga o item de menu especificado deste menu.
Se o item não é parte do menu, nada acontece.
void remove(int index) – apaga o item do índice especificado neste menu.
int countItems() – retorna o número de elementos deste menu.
void addSeparator() – adiciona uma linha separadora a este menu na posição
corrente.
boolean isTearOff() – retorna true se é um menu tear-off.

MenuItem (subclasse de MenuComponent)


Todos os itens de um menu devem pertencer à classe MenuItem ou a uma subclasse. No
modelo de eventos 1.1 quando um item de um menu é seleccionado, um evento de
acção é enviado para o listener registado no menu item, e o método actionPerformed() é
chamado.

A subclasse Menu reescreve este comportamento e não envia qualquer evento para o
frame até que um dos seus subitens esteja seleccionado.

Construtores:

public MenuItem(String label) – constrói um novo item de menu com o label


especificado. O label “-“constrói um separador entre
os itens. Por omissão todos os itens do menu excepto
os separadores são seleccionáveis pelo utilizador.

179
Métodos:

void setLabel(String label) – muda o label do item deste menu para o label
especificado.
String getLabel() – retorna o label deste item do menu ou null se este item do
menu não tem label.
void enable() – torna o item do menu seleccionável pelo utilizador.
void disable() – torna o item do menu não seleccionável.
void enable(boolen sel) – torna o item do menu seleccionável ou não.
boolean isEnabled() – verifica se o item do menu é seleccionável.

Exemplo:

/* Construa uma aplicação que crie uma janela com 3 botões, e uma barra de menus com um
menu constituído por 3 itens. A selecção de um botão ou de um item permite mudar a cor fundo
da janela para a cor designada no respectivo label. */

import java.awt.*;
import java.awt.event.*;

public class MultSources extends Frame {


private Button verm, azul, verde;

public MultSources() {
setTitle("Multiple Event Sources");
setLayout(new FlowLayout());
setSize(300, 200);
addWindowListener( new Terminator());

Menu m = new Menu("Cores");


MenuItem vermItem = new MenuItem("Vermelho");
m.add(vermItem);
vermItem.addActionListener(pbVerm);
MenuItem azulItem = new MenuItem("Azul");
m.add(azulItem);
azulItem.addActionListener(pbAzul);
MenuItem verdItem = new MenuItem("Verde");
m.add(verdItem);
verdItem.addActionListener(pbVerd);
MenuBar mbar = new MenuBar();
mbar.add(m);
setMenuBar(mbar);

setBackground(Color.white);
verm = new Button("Vermelho"); add(verm);
verm.addActionListener(pbVerm);
azul = new Button("Azul"); add(azul);

180
azul.addActionListener(pbAzul);
verde = new Button("Verde"); add(verde);
verde.addActionListener(pbVerd);
}

class ProcessaBotao implements ActionListener {


Color cor;
ProcessaBotao(Color c) {
cor = c;
}
public void actionPerformed(ActionEvent e) {
setBackground(cor);
}
}

class Terminator extends WindowAdapter {


public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

public static void main(String[] args) {


Frame jan = new MultSources();
jan.show();
}
}

181
// Construa uma aplicacao que crie uma janela com 2 botões
// Um botão cria novas janelas enquanto que o outro fecha todas as janelas.

import java.awt.*;
import java.awt.event.*;

public class MultListeners extends Frame {


private Button nova, fechaTodas;
private int contador = 0;

public MultListeners() {
setTitle("Multiplos Listeners");
setLayout(new FlowLayout());
setSize(300, 200);
addWindowListener( new Terminator());
nova = new Button("Nova Janela");
add(nova);
nova.addActionListener(new NovaJanela());
fechaTodas = new Button("Fecha Todas");
add(fechaTodas);
}

class NovaJanela implements ActionListener {

public void actionPerformed(ActionEvent e) {


Frame f = new Frame();
contador ++;
f.setTitle("Janela n. " + contador);
f.setSize(200, 150);
f.setLocation(30*contador, 50+30*contador);
f.show();
fechaTodas.addActionListener(new FechaJanela(f));
}
}
class FechaJanela implements ActionListener {
private Frame jan;
public FechaJanela(Frame f) { jan = f; }
public void actionPerformed(ActionEvent e) { jan.dispose(); }
}
class Terminator extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

public static void main(String[] args) {


Frame jan = new MultListeners();
jan.show();
}
}

182
Dialog (subclasse de Window)
Esta classe representa uma caixa de diálogo, uma janela que recebe input do utilizador.
As caixas de diálogo destinam-se a ser janelas temporárias, que apresentam informação
específica ao utilizador ou que permitem ao utilizador especificar opções para a
actividade corrente.
Cada caixa de diálogo deve pertencer a um Frame. Na criação de uma caixa de diálogo
é necessário a indicação de qual é o seu ”parent frame”.
Uma caixa de diálogo pode ser ou não “modal”. Uma caixa de diálogo modal bloqueia
todos os eventos para outras janelas forçando a que o utilizador elimine esta janela.
Todos os eventos de rato, teclado e foco que ocorrem sobre a janela de diálogo são
enviados para o objecto Dialog.
Quando criada é invisível, pelo que a aplicação deve usar o método show() para fazer
aparecer a caixa de diálogo.
O gestor de posicionamento (“layout manager”) por omissão para uma caixa de diálogo
é o BorderLayout.

Construtores:

public Dialog(Frame parent, boolean modal)


- cria uma caixa de diálogo inicialmente invisível. “parent” é o frame a que a
janela dialog está associada. O 2.º argumento deve ser “true” se se
pretende que a janela seja do tipo modal ou “false” se a janela não deve ser
modal.
public Dialog(Frame parent, String title, boolean modal)
- cria caixa de diálogo com o título especificado.

183
Métodos:

String getTitle() - retorna o título desta caixa de diálogo.


boolean isModal() - retorna true se esta caixa de diálogo é modal, false se não é.
void setTitle() - coloca o título desta caixa de diálogo.

FileDialog (subclasse de Dialog)


Esta classe representa uma caixa de diálogo na qual o utilizador pode seleccionar um
ficheiro. Como é uma caixa de diálogo modal, após a execução do método show()
bloqueia o resto da aplicação até que o utilizador escolha o ficheiro.

public class java.awt.FileDialog extends java.awt.Dialog

Constantes estáticas inteiras:

public static final int LOAD;


public static final int SAVE;

LOAD indica que a caixa de diálogo se destina a determinar o ficheiro para leitura.
SAVE indica que a caixa de diálogo se destina a determinar o ficheiro para escrita.

Construtores:

public Dialog(Frame parent, String title) - cria uma caixa de diálogo com o título
especificado para carregar um ficheiro. Os ficheiros
mostrados são os do directório corrente.
public Dialog(Frame parent, String title, int mode) - cria uma caixa de diálogo com o
título especificado para carregar ou gravar um ficheiro. O
argumento mode deve ter o valor LOAD ou SAVE.

Métodos:

public String getDirectory() – retorna o directório corrente.


public String getFile() – retorna o ficheiro seleccionado ou null se nenhum está
seleccionado.

Window (subclasse de Container)


Um window é uma janela do nível mais alto. Não tem bordo nem barra de menu nem o
atributo modal. Necessita, tal como a Dialog, de um “parent frame”. Pode ser usada para
implementar menus pop-up. O layout por omissão para um window é BorderLayout.

Construtor:
public Window(Frame parent) – constrói uma janela nova invisível. A janela comporta-
se como modal bloqueando input para outras janelas da
aplicação. O método show() torna a janela visível.

184
Métodos:
void dispose() – destrói esta janela e qualquer recurso por ela usado.
void show() – se a janela não é visível torna-a visível; senão trá-la para a frente.
void toBack() – envia a janela para trás.
void toFront() – traz a janela para a frente.

Container (subclasse de Component)


A classe Container é a superclasse abstracta que representa todos os componentes que
podem conter outros componentes.

Métodos:

Component add(Component comp) - adiciona o componente especificado ao fim do


container.
Component add(Component comp, int pos) - indica a posição na qual adicionar este
componente.
Component add(String name, Component comp) - adiciona o componente especificado
ao fim do container. Também adiciona o componente ao gestor de
posicionamento, usando o tag “name” especificado compreendido pelo
gestor de posicionamento.
void setLayout(LayoutManager mgr) - coloca o gestor de posicionamento (“layout
manager”) para este container.
void validate() - valida este container e todos os seus subcomponentes. Este método
causa o container ser novamente organizado depois de lhe serem
adicionados ou removidos componentes. Reescreve validate() da classe
Component.

Component (subclasse de Object)


A classe Component é a superclasse abstracta de muitas classes AWT. Representa
qualquer coisa que tem uma posição e um tamanho, pode ser pintada
no ecrã, e pode receber eventos de entrada.

Métodos (chamados quando ocorre um evento dentro do componente, no modelo de


eventos 1.0):
boolean handleEvent(Event evt)
boolean action(Event evt, Object obj)
boolean gotFocus(Event evt, Object obj)
boolean lostFocus(Event evt, Object obj)
boolean keyDown(Event evt, int key)
boolean keyUp(Event evt, int key)
boolean mouseEnter(Event evt, int x, int y)
boolean mouseExit(Event evt, int x, int y)
boolean mouseMove(Event evt, int x, int y)

185
boolean mouseDrag(Event evt, int x, int y)
boolean mouseDown(Event evt, int x, int y)
boolean mouseUp(Event evt, int x, int y)

Outros métodos:
void paint(Graphics g) - pinta o componente.
void repaint() - causa uma chamada ao método update() logo que possível.
void repaint(int x, int y, int width, int height) – repinta o rectângulo especificado
deste componente.
void update(Graphics g) - limpa o componente enchendo-o com a cor de fundo,
coloca a cor do contexto gráfico na cor corrente (foreground) e
chama o método paint() para redesenhar o componente.
Graphics getGraphics() - retorna o contexto gráfico deste componente.
void resize(int width, int height) – redimensiona este componente para a largura e
altura especificadas. Componentes que estão dentro de um container
com um gestor de posicionamento não devem chamar este método
explicitamente.
void show() - mostra o componente.
void hide() - esconde o componente (não visível).
boolean isShowing() - indica se o componente é visível.
void move(int x, int y) - move o componente.
Color getForeground() - retorna a cor de foreground.
void setForeground(Color c) - coloca a cor de foreground
Color getBackground() - retorna a cor de background.
void setBackground(Color c) - coloca a cor de background.
Font getFont() - retorna a fonte deste componente.
void setFont(Font f) - coloca a fonte deste componente.
void validate(c) - valida este componente se necessário. Este componente e
qualquer subcomponente são colocados novamente se necessário.
Container getParent() - retorna o “parent” deste componente.

186

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy