41
146 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()); }

Exemplos: // Scribble1.java - Modelo de tratamento de

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

146

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());

}

147

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; } }); } }

148

// 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; } } } }

149

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.

150

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); }

} }

151

/* 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); } } }

152

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;

153

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();

154

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); }

155

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. TextArea TextField

Object

Component

TextComponent

156

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('*');

157

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.

158

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);

159

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.

160

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 ); } } } }

161

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 ] );

162

} } } } 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.

163

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); } }

164

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); } }

165

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);

166

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:

167

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;

168

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); } } }

169

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(); } }

170

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.*;

171

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;

172

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); } }

173

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());

174

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.

175

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); } }

176

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); } }

177

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(); } }

178

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.

179

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.

180

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);

181

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(); } }

182

// 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(); } }

183

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.

184

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.

185

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)

186

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.