Componet Es
Componet Es
Componet Es
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
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;
}
}
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
147
// Scribble4.java - Pode-se alterar a visibilidade do applet
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:
ou simplesmente o seguinte:
add( new Label(“Texto1”)); // cria uma instância da classe Label e adiciona-a ao applet
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:
149
Métodos que permitem obter os parâmetros de um botão ou modificá-los:
Tratamento de Eventos
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.*;
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.*;
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.
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.*;
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);
}
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:
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:
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.*;
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.
Object
Component
TextComponent
TextField TextArea
155
Construtores:
Métodos:
Exemplo:
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
156
msg2 = new TextField(30);
msg2.setEditable(false);
add(msg1);
add(password);
add(msg2);
password.addActionListener(new TrataEv());
}
6. TextArea
TextArea – área de edição de texto que pode ter mais que uma linha e scrollbars
horizontal e vertical.
Construtores:
157
Métodos:
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.*;
158
add(t2);
add(l=new Label(" 0"));
}
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:
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.*;
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.*;
161
}
}
}
}
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:
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:
Exemplo:
import java.awt.FlowLayout;
import java.awt.Button;
import java.awt.Color;
import java.applet.Applet;
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, 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;
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:
Construtores:
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);
165
add("East", este);
add("West", oeste);
add("Center", centro);
}
}
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.
Um painel é um contentor que não tem a sua própria janela – tem de estar contido
dentro de outro qualquer contentor
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);
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.
Com este gestor obtém-se a possibilidade de ter diferentes “forms” que podem surgir
(“pop up”) comandadas pelo programa.
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;
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);
}
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.
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.*;
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;
}
}
}
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;
171
if (source == azul) areaDesenho.cor = Color.blue;
if (source == verde) areaDesenho.cor = Color.green;
if (source == amarelo) areaDesenho.cor = Color.yellow;
}
}
}
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.
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();
}
public TrataEv(boolean m) {
mostrar = m;
}
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.
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.*;
175
public static void main(String args[]) {
ApliContador apl = new ApliContador("Aplicação Gráfica: Contador");
apl.setSize(300, 300);
apl.show();
}
}
import java.awt.*;
import java.awt.event.*;
176
public static void main(String[] args) {
Frame jan = new Scribble15();
jan.show();
}
}
import java.awt.*;
import java.awt.event.*;
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.
Construtor:
public MenuBar() – cria uma nova barra de menus.
Métodos:
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:
Métodos:
A subclasse Menu reescreve este comportamento e não envia qualquer evento para o
frame até que um dos seus subitens esteja seleccionado.
Construtores:
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 MultSources() {
setTitle("Multiple Event Sources");
setLayout(new FlowLayout());
setSize(300, 200);
addWindowListener( new Terminator());
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);
}
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 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);
}
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:
183
Métodos:
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:
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.
Métodos:
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