Introdução à Programação Gráfica em Java UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETRÔNICA PROF. VITOR YANO Pacotes Java Dois grandes pacotes Java trazem outros pacotes internos e classes prontas com funcionalidades diversas: pacote java – classes padrões da linguagem para o funcionamento geral do algoritmo; pacote javax – pacotes de extensão que fornecem classes e objetos que implementam maiores funcionalidades a um programa Java. Pacotes AWT e Swing O AWT (Abstract Windowing Toolkit), pertencente ao pacote java, é o primeiro pacote a fornecer classes específicas para programação gráfica de interface com o usuário. O Swing é um pacote baseado no AWT, implementado a partir da versão 1.2 da linguagem Java que apresenta diversas vantagens que serão mostradas posteriormente. Pertence ao pacote javax. AWT AWT AWT Usando o pacote AWT Para utilizar as classes de um pacote, é preciso importá-las. Exemplo: import java.awt.Frame; import java.awt.Button; Para importar todas as classes de um pacote, pode-se usar um asterisco: import java.awt.*; Criando uma janela com AWT Uma janela é criada através da classe Frame. Esta classe possui os diversos métodos necessários para sua personalização e adição de componentes. Exemplo: criando uma janela com botão import java.awt.*; public class ProgramaAWT { public static void main(String[] args) { Frame janela = new Frame("Janela AWT"); Button btnOk = new Button("OK"); janela.add(btnOk); janela.setSize(300, 200); janela.setResizable(false); janela.setVisible(true); } } Criando uma janela com AWT O problema desta forma de construção de janelas é que dificulta o controle de eventos. No exemplo mostrado, a janela não pode ser fechada e o botão não possui função nenhuma. Criando uma janela com AWT O modo mais usado para a criação de uma janela gráfica é a criação de uma subclasse da classe Frame, o que permite implementar novos métodos. Exemplo: criando uma janela com botão 2 import java.awt.*; public class ProgramaAWT extends Frame { private Button btnOk = new Button("OK"); public static void main(String[] args) { ProgramaAWT janelaPrincipal = new ProgramaAWT(); } // construtor da classe ProgramaAWT ProgramaAWT() { super("Janela AWT"); add(btnOk); setSize(300,200); setResizable(false); setVisible(true); } } Controle de eventos Para fechar a janela, utiliza-se a interface WindowListener, pertencente ao pacote java.awt.event. Uma interface é uma classe que possui apenas declarações de métodos, ou seja, não possui métodos implementados e nenhum atributo; Uma interface não pode ser instanciada diretamente, ela serve para definir um padrão de métodos a serem implementados em uma classe. Interface WindowListener package java.awt.event; import java.util.EventListener; public interface WindowListener extends EventListener { public void windowOpened(WindowEvent we); public void windowClosing(WindowEvent we); public void windowClosed(WindowEvent we); public void windowIconified(WindowEvent we); public void windowDeiconified(WindowEvent we); public void windowActivated(WindowEvent we); public void windowDeactivated(WindowEvent we); } Controle de eventos Para fechar a janela, importar o pacote: import java.awt.event.*; Implementar a interface WindowListener: public class ProgramaAWT extends Frame implements WindowListener { Adicionar o controle de eventos à janela (no método construtor): addWindowListener(this); Controle de eventos Implementar os métodos: //executado após a janela ser aberta public void windowOpened(WindowEvent we) { } //executado quando o usuário requisita o fechamento da janela public void windowClosing(WindowEvent we) { System.exit(0); } //executado após o fechamento da janela public void windowClosed(WindowEvent we) { } //executado quando a janela é minimizada public void windowIconified(WindowEvent we) { } //executado quando a janela retorna de minimizada para normal public void windowDeiconified(WindowEvent we) { } //executado quando a janela recebe o foco no sistema operacional public void windowActivated(WindowEvent we) { } //executado quando a janela perde o foco no sistema operacional public void windowDeactivated(WindowEvent we) { } Controle de eventos Para atribuir uma ação ao clicar no botão, pode-se implementar a função handleEvent da classe Frame ou implementar a interface ActionListener, semelhante à WindowListener. Container Nas versões mais recentes do Java, o botão adicionado à janela no exemplo preenche todo o espaço disponível – em versões anteriores não era possível adicionar componentes diretamente a um Frame; Para poder adicionar mais componentes, deve-se utilizar um Container; O Container mais simples é o painel (classe Panel). Exemplo: adicionando dois botões import java.awt.*; public class ProgramaAWT extends Frame { private Panel pan1 = new Panel(); private Button btnOk = new Button("OK"); private Button btnCancel = new Button(“Cancelar"); public static void main(String[] args) { ProgramaAWT janelaPrincipal = new ProgramaAWT(); } // construtor da classe ProgramaAWT ProgramaAWT() { super("Janela AWT"); pan1.add(btnOk); pan1.add(btnCancel); add(pan1); setSize(300,200); setResizable(false); setVisible(true); } } AWT Existem diversas outras propriedades dos componentes AWT, eventos, caixas de diálogo, menus, layout, etc. Todas as classes e métodos do pacote estão documentados no site da Oracle: http://download.oracle.com/javase/7/docs/api/java /awt/package-summary.html AWT x Swing A classe AWT faz chamadas diretamente para o sistema operacional para exibir os componentes da interface gráfica, isto é, usa funções nativas do mesmo. Isso torna seu código mais leve e mais rápido, além de manter a interface com a mesma aparência do sistema operacional onde está sendo executada; Porém, isso torna o aplicativo dependente da plataforma, e o conjunto de componentes oferecido se torna limitado ao existente em qualquer sistema operacional AWT x Swing A partir da versão 1.2 da linguagem Java, o pacote de classes Swing passou a ser incorporado. Este pacote implementa todos os componentes de interface, tornando-o independente do sistema operacional ou ambiente de janelas. Além disso, permite a criação de um conjunto ilimitado de componentes de interface; A desvantagem do Swing em relação ao AWT é o desempenho, pois neste caso todo o controle da interface é de responsabilidade da JVM e não do sistema operacional Swing As classe do pacote Swing são 100% compatíveis com as do AWT, ou seja, todos os métodos das classes AWT são implementadas, além de outras; Basicamente, a diferença na nomenclatura das classes está na inclusão de uma letra “J” no início do nome: JFrame, JPanel, JButton, JLabel, JTextField, JCheckBox, porém há exceções, como JRadioButton e JComboBox. Além dos componentes já existentes no AWT, o Swing implementa outros mais avançados, como JTabbedPane, JToolBar, JInternalFrame, JColorChooser, JFormattedTextField, JSpeener, JPasswordField, JMenuBar, entre outros.