Interfaces gráficas em Java
Introdução
• As bibliotecas gráficas em JAVA são bastante simples no que diz respeito a conceitos necessários.
• A complexidade no aprendizado de interfaces gráficas em Java reside no tamanho das bibliotecas e no enorme
mundo de possibilidades; isso pode assustar, num primeiro momento.
• Material oficial da Sun:
Interfaces gráficas em Java
Java suporta, oficialmente, dois tipos de bibliotecas gráficas:
• AWT (Abstract Window Toolkit ):
– é o antigo conjunto de ferramentas para interfaces gráficas do
Java. Serve para oferecer infraestrutura mínima de interface gráfica (nivela por baixo)
– Componentes têm aparência dependente de plataforma
– Limitado em recursos devido a depender de suporte de cada plataforma para os componentes oferecidos
– Bugs e incompatibilidades entre plataformas
• JFC (Java Foundation Classes) oferece uma interface muito mais rica
– Swing é o nome dado à coleção de componentes
Tipos de Aplicações
• Há dois tipos de aplicações gráficas em Java
– Componentes iniciados via browser (applets)
– Aplicações standalone iniciadas via sistema operacional
• Ambas capturam eventos do sistema e desenham-se sobre um contexto gráfico fornecido pelo sistema
• Applets são aplicações especiais que rodam a partir de um browser:
– São componentes que executam em um container – (ambiente operacional) fornecido pelo browser
– Browser é quem controla seu ciclo de vida (início, fim, etc.) – Geralmente ocupam parte da janela do browser mas podem
abrir janelas extras;
java.awt.Component
• Raiz da hierarquia de componentes gráficos
– Componentes Swing herdam de javax.swing.Jcomponent, que é "neto" de Component
• Há um Component por trás de tudo que pode ser pintado
na tela
• Principais métodos (chamados pelo sistema):
– void paint (java.awt.Graphics g) – void repaint()
– void update(java.awt.Graphics g)
• O objeto passado como argumento durante a execução
(contexto gráfico) é, na verdade, um java.awt.Graphics2D
Componentes AWT
Há dois tipos importantes de componentes:
1) descendentes diretos de
java.awt.Component
– "Apenas" componentes: descendentes da classe
Component que não são descendentes de Container (todos os componentes da AWT)
2) descendentes de
java.awt.Container
– Subclasse de java.awt.Component
– São "recipientes." Podem conter outros componentes.
– São descendentes da classe Container: Frame, Panel,
Applet e JComponent (raiz da hierarquia dos componentes Swing)
Containers essenciais
• Frame
(AWT) e
JFrame
(Swing)
– Servem de base para qualquer aplicação gráfica
• Panel e Jpanel
– Container de propósito geral
– Serve para agrupar outros componentes e permitir layout em camadas
• Applet e Japplet
– Tipo de Panel (JPanel) que serve de base para aplicações que rodam dentro de browsers
– Pode ser inserido dentro de uma página HTML e ocupar o contexto gráfico do browser
Exemplo de JFrame (Herança)
package interfaceGrafica;
import javax.swing.*;
public class MinhaJanela extends JFrame { public MinhaJanela(String nome) {
super(nome);
this.setSize(400,350);
this.setVisible(true); }
public static void main(String[] args) {
new MinhaJanela("Minha 1ª Janela"); }
Exemplo de JFrame (Composição)
package interfaceGrafica;
import javax.swing.*;
public class MinhaJanela2 {
public static void main(String[] args) {
JFrame frame = new JFrame("Minha 2ª
Janela"); frame.setVisible(true); frame.setSize(400, 200); janela.setDefaultCloseOperation(JFrame.EXIT_ON _CLOSE); }
Hierarquia de um JFrame
package interfaceGrafica; import java.awt.*; import javax.swing.*; public class MinhaJanela2 {
private static void createAndShowGUI() {
JFrame frame = new JFrame("Minha Janela 2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Criano um menu bar.
JMenuBar greenMenuBar = new JMenuBar(); greenMenuBar.setOpaque(true);
greenMenuBar.setBackground(new Color(154, 165, 127)); greenMenuBar.setPreferredSize(new Dimension(200, 20)); //Creando um label. Colocando dentro de um content pane.
JLabel yellowLabel = new JLabel(); yellowLabel.setOpaque(true);
yellowLabel.setBackground(new Color(248, 213, 131)); yellowLabel.setPreferredSize(new Dimension(200, 180)); //Set the menu bar and add the label to the content pane.
frame.setJMenuBar(greenMenuBar);
frame.getContentPane().add(yellowLabel, BorderLayout.CENTER); //Display the window.
frame.pack();
frame.setVisible(true); }
public static void main(String[] args) { createAndShowGUI();
}
Criando um Fórmulário
A maioria das aplicações gráficas tem formulário para entrada de dados. A API do Swing traz uma série de componentes
visuais prontos para uso. São campos de texto, botões,
checkboxes, labels, tabelas, árvores e muitos outros.
Criando um Fórmulário
• Todo componente Swing deve ser adicionado a um contêiner (Container) que administrará o agrupamento e exibição dos mesmos. Usaremos o container mais comum, um Jpanel. Através de seu método add, conseguimos adicionar nossos componentes:
• Para exibirmos nosso formulário simples, precisamos
colocar nosso Jpanel em uma janela.
O método pack() de JFrame redimensiona nosso frame para um tamanho adequado baseado nos componentes que ele tem.
Exemplo de um Formulário (Composição) public class MinhaJanela2 {
public static void main(String[] args) {
JFrame janela = new JFrame("Minha 3ªJanela"); janela.setVisible(true);
janela.setSize(400, 200);
JLabel lbNome = new JLabel("Nome"); JTextField tfNome = new JTextField(20); JPanel painel = new JPanel();
painel.add(lbNome); painel.add(tfNome); janela.add(painel);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Criando um método para montar o formulário
package interfaceGrafica;
import javax.swing.*;
public class Formulario {
private JLabel label;
private JTextField textField;
private JPanel panel; private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
panel = new JPanel();
panel.add(label);
panel.add(textField);
frame = new JFrame("Meu primeiro formulário");
frame.add(panel);
frame.pack(); frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) {
new Formulario().montaFormulario(); }
Exemplo Herança e Método para montar (Netbeans)
import javax.swing.*;
public class Formulario extends JFrame{
private JLabel lbNome;
private JTextField tfNome;
private JPanel panel;
private void montaFormulario() {
lbNome = new JLabel("Seu nome:");
tfNome = new JTextField(20);
panel = new JPanel();
panel.add(lbNome);
panel.add(tfNome);
this.add(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) { Formulario f = new Formulario();
Exercício • Crie o seguinte formulário:
A princípio não se preocupe com o layout (cenas do
próximo capítulo). Em tempo de execução
podemos redimensionar o formulário:
Introdução a Eventos
• O formulário anterior é até que interessante para começar a
aprender Swing, mas ele é totalmente inútil. Queremos ser capazes de recuperar o valor digitado pelo usuário para efetuar alguma
operação(Explodir uma bomba, salvar no BD, exibir, enviar via rede, mandar um email, etc).
• Para fazermos efetivamente alguma coisa, trabalhamos com eventos que são disparados pelo usuário. O Swing possui uma forma muito elegante de trabalhar com eventos - através de interfaces. O usuário pode disparar eventos ao digitar, ao clicar, ao passar o mouse, e
muitas outras situações.
• No nosso formulário, usaremos um botão (componente) que, quando clicado pelo usuário (evento), disparará um método
(tratador/handler). Neste método, vamos recuperar o texto digitado pelo usuário e efetuar alguma ação.
Trabalhando com Butões (Jbutton)
• O componente Swing que representa um botão é o Jbutton. Precisamos criar um botão e colocá-lo no nosso container (o JPanel):
• Isso acrescentará o botão ao formulário
• Mas como disparar um método quando o botão for clicado?
Exemplo Simples (Sem eventos)
import javax.swing.*;
public class JanelaBotao extends JFrame{
private JButton botao; private JPanel painel;
public void montaInterface(){
botao = new JButton("enviar"); painel = new JPanel();
painel.add(botao);
this.add(painel);
this.setSize(100,100); this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Trabalhando com Eventos (Listeners)
• O Swing nos traz o conceito de Listeners (ouvintes), que são interfaces que implementamos com métodos para serem disparados por eventos.
• No nosso caso, para fazer um método disparar ao clique do botão, usamos a interface ActionListener. Essa interface nos dá um método
Trabalhando com Eventos (Listeners)
• Queremos, quando o botão for clicado, pegar o texto digitado pelo usuário e exibir na tela (vamos usar o JOptionPane para isso). Nosso método,
actionPerformed fica desta forma:
O último detalhe que falta, é indicar que essa ação (esse ActionListener) deve ser disparado quando o botão for clicado. Fazemos isso através do método addActionListener, chamado no botão. Ele recebe como argumento um objeto que implementa ActionListener (no nosso caso, o próprio
Exemplo Completo package interfaceGrafica;
import java.awt.event*;import javax.swing.*;
public class Formulario implements ActionListener {
private JLabel label; private JTextField textField;
private JButton button;private JPanel panel;private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
button = new JButton("Exibir");
button.addActionListener(this);
panel = new JPanel();
panel.add(label); panel.add(textField);
panel.add(button);
frame = new JFrame("Meu primeiro formulario");
frame.add(panel); frame.pack(); frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public void actionPerformed(ActionEvent e) { String texto = textField.getText();
JOptionPane.showMessageDialog(frame, texto); }
public static void main(String[] args) {
new Formulario().montaFormulario(); }
Exemplo Simples (com eventos)
import javax.swing.*;
public class JanelaBotao extends JFrame Implements ActionListener {
private JButton botao; private JPanel painel;
public void montaInterface(){
botao = new JButton("enviar"); ...
botao.addActionListener(this);
}
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(this, "oi");
}
Exemplo Simples 2 (com eventos)
import javax.swing.*;
public class JanelaCom2Botoes extends JFrame{
private JButton botao; private JPanel painel;
public void montaInterface(){
botao = new JButton("enviar");
botao.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { JOptionPane.showMessageDialog(null, "botao1");
} });
painel = new JPanel(); painel.add(botao);
this.add(painel);
this.setVisible(true);
Exercício
• Crie um interface e coloque 3 botões com 3 ações distintas...
Exercício
• Adicionar o Evento do botão ao formulário de Cadastro de Funcionário;
• Na ação do actionPerformed você deve cadastrar o funcionario no banco de dados com usando o
Gerenciador de empresa:
– GerenciadorDeEmpresa ge = new GerenciadorDeEmpresa(); – Não esquecer de fechar a conexão;