This report aims to show the functioning of the graphics capabilities of the platform JAVA programming offers, detailing its implementation, communication with the operating system, classes available and their use. Both have tackled Swing AWT as: its main features, drawing mode, addressing performance and portability, as well as their differences. Emphasis will be given to Swing, due to new components offered that solve some problems encountered in the use of AWT. Are some examples of panels, using Swing components of the package.
1. CENTRO FEDERAL DE EDUCAÇÃO TECNOLOGICA DO ESTADO DE ALAGOAS
COORDENADORIA DE INFORMATICA
LINGUAGEM DE PROGRAMAÇAO II
PROFESSOR MARCILIO JUNIOR
CAPACIDADES GRÁFICAS DA PLATAFORMA
JAVA
Giovanni de A. Calheiros
João Paulo de Lima Braga
Michel Alves dos Santos
Maceió, 16 de Fevereiro de 2004
2. CENTRO FEDERAL DE EDUCAÇÃO TECNOLOGICA DO ESTADO DE ALAGOAS
COORDENADORIA DE INFORMATICA
LINGUAGEM DE PROGRAMAÇAO II
PROFESSOR MARCILIO JUNIOR
CAPACIDADES GRÁFICAS DA PLATAFORMA
JAVA
Giovanni de A. Calheiros
João Paulo de Lima Braga
Michel Alves dos Santos
Maceió, 16 de Fevereiro de 2004
3. Introdução
Esta apresentação visa mostrar o funcionamento das capacidades gráficas que a
plataforma de programação JAVA oferece, detalhando sua implementação,
comunicação com o sistema operacional, classes disponíveis e utilização das mesmas.
Tanto AWT quanto Swing terão abordados: suas características principais, modo de
desenho, abordagem de performance e portabilidade, além de suas diferenças. Será
dado uma ênfase ao Swing, devido aos novos componentes oferecidos, que resolvem
alguns problemas encontrados na utilização da AWT. Serão apresentados alguns
exemplos de painéis, utilizando componentes do pacote Swing.
4. AWT Abstract Windowing Toolkit – Caixa de ferramentas para
janelamento abstrato
Primeiro sistema de janelamento introduzido na plataforma JAVA, tendo por
base as diretrizes de cada sistema de janelamento (MOTIF – CDE, Windows GUI, MAC
GUI,...). Considerado pesado por muitos programadores, e além disso não tão
extensível pois a possibilidade de manufatura de componentes torna-se um trabalho
árduo. Resolvia a maioria dos problemas de programação, com base na criatividade do
programador, pois não dispunha de componentes hoje existentes em Swing. Seríamos
eufêmicos ao dizer que AWT usa por base apenas as diretivas do sistema nativo, seu
acoplamento é mais enraizado, pois o desenho e a execução GUI fica por conta da
plataforma nativa, ou seja pela API do SO. Os componentes do pacote java.awt são
diretamente relacionados com as capacidades gráficas da plataforma hospedeiro. O
segredo é que o AWT executa apenas as funções comuns a todos os sistemas de
janela. Dessa forma, um mesmo programa JAVA pode apresentar aparências diversas,
quando executado em diferentes plataformas. O que causa uma sensível perda em
performance e portabilidade. Para contornar a maioria dos problemas de janelamento
uma classe de controle do ambiente foi introduzida, seu nome é GraphicsEnviroment
(classe responsável por armazenar todo o contexto de ambiente da plataforma que
hospeda a aplicação; exemplo: resolução presente, resolução máxima, profundidade de
cores em bits, cartão gráfico, número de ambientes em que esta rodando – terminais).
Mesmo assim os problemas de programação que necessitassem de um pouco
mais desse sistema encontrariam barreiras que poderiam ser facilmente transpostas
por meio de plataformas de programação RAD tais como: VB, Delphi, Clarion, TCL/TK,
GTK, Glade, Lazarus, Visual C++, C Builder, claro que não alcançando a mesma
portabilidade que a linguagem JAVA propunha.
Além disso AWT conta apenas com um PLAF (Plataform Look-and-Feel) ou seja,
uma única forma de apresentação da sua GUI variando de plataforma para
plataforma.
Java em AWT utiliza os chamados objetos equivalentes (bibliotecas .peer –
bibliotecas que fazem referência a GUI do sistema operacional. Exemplo: peer do
Windows, peer do MAC, peer MOTIF/CDE). Quase todos os componentes da AWT são
sub classes da classe Component.
Visão hierárquica da classe Component
java.lang.Object
|
+-- java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Window
| |
| +--java.awt.Dialog
| | |
| | +--java.awt.FileDialog
| |
| +--java.awt.Frame
|
+--java.awt.Panel
|
+--java.applet.Applet
5. Código para uso de frames em AWT.
/**
*class : AWTFrame – Exemplo que ilustra o uso de frames no AWT.
*@author : Turma de Java 2003.2
*data : 16/02/2004
**/
import java.awt.*;
import java.awt.event.*;
/**Classe que extende a classe Frame do sistema AWT*/
public class AWTFrame extends Frame {
/**Metodo principal*/
public static void main (String args[]){
AWTFrame fu = new AWTFrame();
fu.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
/**Propriedades*/
fu.setTitle("AWTFrame");
fu.setLocation(200,200);
fu.setSize(400,200);
fu.setVisible(true); //O metodo show() está ultrapassado.
}
/**Metodo de renderização ou pintura de todos as classes
*que derivam de component - ou melhor classes gráficas*/
public void paint(Graphics g){
g.setColor(Color.black);
g.drawRect(100,70,90,55);
g.fillRect(200,70,90,55);
}
}
6. Visão dos Frames AWT
Frame awt sem sobreposição do método paint(). Awt não define por padrão o evento de janela
windowClosing, por isso esse deve ser implementado. Diferente do sistema Swing que tem seu método
setDefaultCloseOperation disparado automaticamente nesse evento.
Frame awt com sobreposição do método paint(). É definido dentro do método o desenho de dois
retângulos, um não preenchido e o outro totalmente. Nota-se que os frames awt tem por padrão o
preenchimento na cor branca.
8. Diagrama ou hierarquia das classes java.awt.peer, que é a implementação nativa dos componentes
GUI da plataforma hospedeira. Essas classes recebem as solicitações feitas pelos componentes da AWT, tal
como execução de um método.
Criação de um botão. Veja a comunicação que é feita com a biblioteca peer da plataforma
hospedeira. Abaixo, a execução do método setLabel().
9. SWING seguindo a tendência de nomenclatura usando
nome de ritmos musicais.
Sistema de janelamento introduzido na plataforma JAVA para solucionar alguns
problemas decorrentes do projeto da AWT. O pacote Swing é parte do Java Foundation
Classes (JFC) da plataforma Java. O JFC engloba um grupo de características para
ajudar pessoas a construir GUIs. Swing usa por base toda a implementação de
diretrizes da AWT e da classe GraphicsEnviroment, mas um ponto essencial deve ser
apresentado: o janelamento é feito pelo próprio SWING, ou seja, a própria JVM executa
o desenho dos componentes; pode parecer um trabalho extensivo, mas essa execução
poupa muito da implementação especifica, que seria ajustada para cada forma de
janelamento, fazendo com que esse sistema torne-se ainda mais portável, contando
dessa forma com uma grande gama de componentes que podem ser estendidos,
adaptados, combinado e “remanufatrados”.
Swing torna a plataforma JAVA uma “suíte de desenvolvimento” à altura de
linguagens RAD (VB, Delphi, Clarion, Visual C++, Visual Cobol, etc), disponibilizando
as mesmas facilidades de desenho de interfaces, um completo sistema de cores,
painéis especializados e componentes com alta facilidade de integração, mas para que
essas facilidade sejam usufruídas uma IDE deve ser utilizada, pois o pacote JSDK da
SUN não acompanha uma ferramenta de desenho de interfaces. Exemplo: NetBeans,
Visual Café, Eclipse, Forte, dentre outras.
Arquitetura gráfica da plataforma hospedeira, demonstrando a extensão do sistema de janelamento Swing.
No AWT não são encontrados painéis especializados como JdesktopPane ou
JInternalFrame, o último muito utilizado na implementação de aplicações MDI(Multiple
Data Interface), essa aplicação é essencialmente constituída de uma Janela mestre e
as demais subordinadas a esta, daí a necessidade de janelas filho ou janelas internas.
Antes (no AWT) os frames filhos eram apenas frames normais que tinham a opção
Frame.CHILD setada. No decorrer do trabalho serão apresentados os componentes
mais utilizados que constituem o pacote javax.swing: JFrame, JPanel, JInternalFrame,
JLabel, JButton, JToggleButton, JCheckBox, JRadioButton, ButtonGroup, JList,
JTextField, JTextArea, JTabbedPane, JScrollBar, JScrollPane, JPopupMenu, JComboBox,
JMenu, JMenuBar, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem,
JOptionPane, JTable, JToolBar, dentre vários outros.
10. Look-and-Feel das janelas do pacote javax.swing. Este PLAF, é chamado de cross-plataform ou metal.
Hierarquia da classe JFrame, mostrando sua derivação da classe Frame do pacote AWT. Diferentemente de
Frame os objetos da classe Jframe tem alguma noção de como responder a ação de fechar janela imposta
pelo usuário. Por padrão a janela é escondida quando o usuário executa ação. O método que é executado
decorrente a ação pode ter seu valor mudado pelo método setDefaultCloseOperation() que recebe um
inteiro para indicar a ação padrão de fechamento da janela (DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE,
DISPOSE_ON_CLOSE, EXIT_ON_CLOSE – em exit_on_close o método exit da classe system é chamado,
enquanto que em dispose apenas a janela é fechada liberando os recursos que ela alocou).
Especificação das novas classes implementadas em Java, incorporadas à nova especificação do JSDK, está
visível na figura que o pacote swing herda do pacote awt, dispensando seus problemas e utilizando suas
qualidades. Uma verdadeira filtragem em suas propriedades (widgets). A especificação JFC tende a separar
os pacotes java2D e java3D e os mecanismos de drag-and-drop. Mas todos eles estão dentro da mesma
especificação.
A Relação entre os pacotes AWT e Swing das versões 1.1 e 1.2, quando deixou de ser uma biblioteca (.jar)
para integrar o pacote.
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--java.awt.Window
|
+--java.awt.Frame
|
+--javax.swing.JFrame
11. Hierarquia das classes do pacote javax.swing, observando os componentes top-levels. Esses componentes
derivam da classe JPanel: JApplet, JDialog, JFrame, JWindow. As classes representadas por um
paralelogramo são classes abstratas, que só podem ser herdadas.
12. Diagrama de classe de uma JButton
ALGUNS COMPONENTES SWING. Aqui estão algumas dos componentes comumente
utilizados:
JButtons JComboBox JList
JDialog JMenu
13. LOOK-AND-FEEL. O pacote javax.swing possui 4 formas de visualização de sua GUI
usado em suas componentes, são elas : Java Look and Feel ( Metal/CrossPlataform ),
CDE/Motif Look and Feel, MAC Look and Feel e Windows Look and Feel. Tendo presente
a forma MAC Look and Feel apenas nas plataformas Macintosh. Veja o exemplo abaixo:
Java look and feel
CDE/Motif look and feel
Windows look and feel
JScrollPane JFrame
JTable (conhecido como grid em outras plataformas)
14. O exemplo acima pode ser adquirido no site da sun na seguinte url :
http://java.sun.com/docs/books/tutorial/uiswing/mini/secondexample.html , lá o leitor
encontrará a classe SimpleExample.java, que mostra de forma básica de como mudar
a visualização para a GUI de sua escolha. Logo abaixo temos a visualização de alguns
componentes e seus respectivos look and feels: Metal, MAC, Motif.
Formas de apresentação da GUI em java.
Exemplo de caixas de alerta em Windows, CDE e plataforma Macintosh
15. Tabela com nomes de componentes da JFC. Logo abaixo temos uma lista de
componentes da JFC (especificação java para novas classes). É notória a superioridade
em número de componentes Swing em relação a lista de componentes AWT
apresentada na página número 7 deste trabalho. Essa lista foi tirada da seguinte
página da sun :http://java.sun.com/products/jlf/ed2/book/HIG.Classes2.html#39575,
essa página faz parte da seção sobre o livro “Java Look and Feel Design Guidelines,
second edition.”
Componente Nome Nome Comum
JApplet Applet
JButton Command button e toolbar button
JCheckBox Checkbox
JCheckBoxMenuItem Checkbox menu item
JColorChooser Color chooser
JComboBox Noneditable e editable combo boxes
JDesktopPane Backing window
JDialog
Dialog box, secondary window, e utility
window
JEditorPane Editor pane
JFrame Primary window
JInternalFrame
Internal window, minimized internal
window, e internal utility window
JLabel Label
JList
List components (list boxes e e listas
selecionáveis)
JMenu Drop-down menu e submenu
JMenuBar Menu bar
JMenuItem Menu item
16. JOptionPane Alert box/Caixa de alerta
JPanel Panel
JPasswordField Password field/Campo de senha
JPopupMenu Contextual menu
JProgressBar Progress bar/Barra de progresso
JRadioButton Radio button
JRadioButtonMenuIte
m Radio button menu item
JScrollBar Scrollbar
JScrollPane Scroll pane
JSeparator Separator
JSlider Slider
JSplitPane Split pane
JTabbedPane Tabbed pane
JTable Table
JTextArea Plain text area
JTextField
Noneditable e editable text fields (single
line)
JTextPane
Editor pane com editor kit plug-in
estilizado.
JToggleButton Toggle button e toolbar toggle button
JToolBar Toolbar
17. JToolTip Tool tip/rótulo de dicas
JTree Tree component/Árvore
JWindow Janela Plana, sem barra de título.
GERENCIADORES DE EVENTOS. No exata momento em que optamos por trabalhar
com interfaces gráficas, temos que aprender a lidar com os eventos. As interfaces
gráficas são elementos baseados em eventos. De uma maneira geral eventos são
interações disparadas por usuários ou pelo próprio sistema. Mover o mouse é um
evento, fechar uma janela é um outro evento. Eventos ocorrem a todo instante nos
aplicativo modernos e, portanto devemos compreender como tratá-los. Quando um
usúario interage com um objeto da interface gráfica, um evento é enviado
automaticamente para o programa, na expectativa de que ele seja identificado e
convenientemente tratado para produzir algum tipo de resposta à ação realizada sobre
o objeto.
O processamento de um evento exige duas providências :
1 – Registrar um ouvinte de eventos (listener);
2 – Implementar um manipulador de eventos (handler).
O registro de eventos se processa através de interfaces disponibilizadas por
pacotes do Java, como java.awt.event e javax.swing.event. Há, em Java, diversos
tipos de ouvintes de eventos. A interface EventListener, disponibilizada pelo pacote
java.util, deriva diversas sub-interfaces que se preocupam em ouvir eventos
específicos.
Listamos abaixo, as que julgamos mais utilizadas :
ActionListener – eventos de ação: clicar num botão.
ComponentListener – eventos de componentes: redimensionar uma janela.
ContainerLIstener - eventos de contêineres : adicionar ou remover um objeto
de um contêiner.
FocusListener – eventos relacionados ao foco dos objetos : quando um objeto
recebe ou perde o foco.
KeyListener – recebe eventos relacionados ao teclado.
MouseListener – eventos relacionados ao mouse.
WindowListener – eventos relacionados as janelas : redimensionar,
minimizar, fechar, etc.
Exemplo : Trecho de código referente ao registro de um ouvinte e implementação de um handler
para um evento de janela.
frameExemplo.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
18. Logo abaixo a lista com a hierarquia de interfaces do pacote java.awt.event:
Hierarquia de Interfaces
interface java.util.EventListener
interface java.awt.event.ActionListener
interface java.awt.event.AdjustmentListener
interface java.awt.event.AWTEventListener
interface java.awt.event.ComponentListener
interface java.awt.event.ContainerListener
interface java.awt.event.FocusListener
interface java.awt.event.HierarchyBoundsListener
interface java.awt.event.HierarchyListener
interface java.awt.event.InputMethodListener
interface java.awt.event.ItemListener
interface java.awt.event.KeyListener
interface java.awt.event.MouseListener
interface java.awt.event.MouseMotionListener
interface java.awt.event.MouseWheelListener
interface java.awt.event.TextListener
interface java.awt.event.WindowFocusListener
interface java.awt.event.WindowListener
interface java.awt.event.WindowStateListener
ActionListener : Uma pequena ilustração sobre o evento action listener.
ActionListener é uma interface Java implementada por muitos componentes da GUI,
tais como botões. Tem somente um método – actionPerformed. Aqui esta sua
definição:
public Interface ActionListener {
public void actionPerformed(ActionEvent e)
}
GERENCIADORES DE LAYOUT. Na tentativa de facilitar as coisas para os
programadores, Java oferece classes que especificam como os componentes devem ser
posicionados em um contêiner. Essas classes são conhecidas como gerenciadores de
layout. Os tipos propostos pela linguagem são : Border Layout , Flow Layout, Grid
Layout, Box, Card, GridBag e Null Layout (que na verdade não é um gerenciador mas
sim a falta de um). Vamos falar sobre alguns deles.
19. Border Layout. Gerenciador padrão dos objetos JFrame, de acordo com esse
gerenciador o conteiner pode ser visto como uma área dividida em cinco regiões :
Norte, Sul, Leste , Oeste e Centro. Em cada uma dessas áreas um novo objeto pode ser
inserido , podendo esse novo objeto um conteiner com o seu próprio gerenciador de
layout.
Border Layout
Flow Layout. Gerenciador de layout baseado em fluxo, sendo a disposição dos objetos
adicionados da esquerda para a direita e , em seguida, centralizados na ordem que são
adicionados ao conteiner.
Flow Layout
20. Card Layout. Permite empilhar objetos como se fossem cartas de um baralho.
Podemos colocar painéis uns em cima dos outros ...
... e podemos visualizá-los no momento em que quisermos.
21. Grid Layout. Define um layout em forma de grade, com o número de linhas
necessárias para conter os objetos. O detalhe é que os objetos serão sempre do
mesmo tamanho e se ajustarão automaticamente a qualquer variação no tamanho da
janela.
Grid Layout.
Grid Layout. A exemplo do gerenciador GridLayout, também organiza objetos em uma
grade. Entretanto trata-se de um gerenciador muito mais flexível, poderoso e
complexo, permitindo alinhar objetos vertical e horizontalmente, sem impor que todos
os objetos tenham o mesmo tamanho.
GridBag Layout