Java - Introdução ao Swing (Interface)

Preview:

Citation preview

Java - Introdução ao Swing (Interface)Prof: Sérgio Souza Costa

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)

prof.sergio.costa@gmail.com

https://sites.google.com/site/profsergiocosta/home

https://twitter.com/profsergiocosta

http://gplus.to/sergiosouzacosta

http://www.slideshare.net/skosta/presentations?order=popular

Continuando sua aventura no mundo Java

O programador C decide experimentar sua primeira aplicação GUI (Graphical User Interface), ou seja, Interface gráfica do Usuário.

Estou habituado com estas interfaces, uso todo dia.

Elas são compostas por elementos como:

Elas são compostas por elementos como: janelas

Elas são compostas por elementos como: janelas, botões

Elas são compostas por elementos como: janelas, botões, caixa de combinação

Elas são compostas por elementos como: janelas, botões, caixa de combinação, botão de opção

Elas são compostas por elementos como: janelas, botões, caixa de combinação, botão de opção, caixa de texto

Elas são compostas por elementos como: janelas, botões, caixa de combinação, botão de opção, caixa de texto, caixa de listagem

Além deste controles, temos menus

Além deste controles, temos menus e menus de contexto.

Português Inglês

Janela Window (pode ser referenciado como form or frame)

Botões Button

Caixa de combinação Combo box

Botão de opção Option button

Caixa de texto Text box, text field or text enty box

Caixa de listagem List box

Menu Menu

Menu de contexto Context menu

Os principais controles em português e inglês

Como o Java possui um grande framework, ele deve ter um conjunto de objetos para cada um destes elementos gráficos

Isso mesmo, o Java possui o AWT (Abstract Window Toolkit) e o Swing. O Swing é mais recente e prove

controles nativos em Java, diferentemente do AWT.

Mas o importante agora é conhecer os componentes

Swing.

Qual é o componente mais importante entre citados ?

A Janela, cada aplicativo tem a sua própria, e é nela que temos botoes como fechar, maximizar e minimizar.

Isso, em Swing, uma Janela é suportada pelo componente Jframe (todos componentes

swing começa com “J”)

Entendi, basta instancia um objeto do tipo Jframe. Certo ?

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();}}

Nada apareceu

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();}}

Ah … a janela não é mostrada até que eu mande mostrar, ou

seja, setVisible (true)

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();frame.setVisible(true);

}}

O Tamanho da Janela é o mínimo possível para mostrar

os botoes de fechar e maximizar.

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();frame.setVisible(true);

}}

Mas eu posso definir o tamanho (em pixels) que eu

queira.

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();frame.setVisible(true);frame.setSize (200,200);

}}

Porém minha aplicação nao fecha, quando clico no botão

de fechar ☹

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();frame.setVisible(true);frame.setSize (200,200);

}}

Para o Java, o comportamento padrão para

este botão é minimizar. Se quiser que ele feche é preciso

“dizer” isso explicitamente.

Agora sim, minha Janela que não faz nada já está

funcionando ☺

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();frame.setDefaultCloseOperation(

JFrame.EXIT_ON_CLOSE);frame.setSize (200,200);frame.setVisible(true);

}}

Agora, vou adicionar algum componente a minha Janela, por exemplo, um botão.

public class SwingOla {public static void main(String[] args) {

JFrame frame = new JFrame ();JButton bt = new JButton ("Diga Ola");frame.add(bt);

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);

frame.setSize (200,200);frame.setVisible(true);

}}

Este botão é realmente grande, além disso, como faço para adicionar alguma ação a ele ?

O Java, precisa saber como ele vai organizar todos os

componente que você adiciona.

Ele possui politicas de layout, o padrão é o “border layout”,

centralizado.

Ele divide a Janela, como abaixo. Quando adiciona um

novo objeto, ele vai ser adicionado ao centro.

Estas linhas são então equivalentes.

frame.add(bt, BorderLayout.CENTER);

frame.add(bt);

frame.add(bt, BorderLayout.NORTH); frame.add(bt, BorderLayout.SOUTH);

frame.add(bt, BorderLayout.EAST); frame.add(bt, BorderLayout.WEST);

Um outro layout ,mais simples, é o flowlayout, neste os objetos

vão ocupando o espaço da esquerda para direita. Caso necessário, ocupam a linha

seguinte

JFrame frame = new JFrame ();frame.setLayout(new FlowLayout());frame.setSize (200,200);JButton bt = new JButton ("Diga Ola");frame.add(bt);frame.add(new JButton ("Diga Adeus"));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);

Entendi, é como digitar texto no Word. Os componentes “fluem” de acordo com o tamanho da janela.

aContainer.setLayout(new GridLayout(2, 3));

O GridLayout divide o container em celulas invisiveis, que serão preenchidas com os componentes.

Com este layout, os componente preenchem o container da esquerda para direita.

JFrame frame = new JFrame ();frame.setLayout(new GridLayout(2, 3));frame.setSize (200,200);for (int i =1; i < 7; i ++) {

frame.add(new JButton ("Botão:"+i));}frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);

Usando o componente Jpanel (nao visível), podemos gerar layouts mais complexos, agrupando controles.

JFrame frame = new JFrame ();JPanel panNome = new JPanel ();panNome.setLayout(new FlowLayout());panNome.add(new JLabel ("Nome:"));JTextField txtNome = new JTextField (15);panNome.add (txtNome);JPanel panEmail = new JPanel ();panEmail.add(new JLabel ("Email:"));JTextField txtEmail = new JTextField (15);panEmail.add (txtEmail);frame.setLayout(new FlowLayout());frame.setSize (250,150);frame.add(panNome);frame.add(panEmail);

Ok. Estou começando entender os layout, mas agora quero colocar “ações” aquele meu aplicativo.

O Java suporta o coneito de eventos, onde os objetos são divididos fontes (sources) e receptores (listenners).

Um evento é produzido por ações do usuário, ou seja, resultado da interação do usuário com a interface, como movimento ou click de mouse, pressionar de uma tecla …

Existem diversos eventos, onde cada componente pode disparar determinados eventos. Veremos melhor sobre eles numa aula futura.

No teu caso, você precisa capturar o evento “action” do botão. Para isso precisamos de um objeto receptor para este tipo de evento.

Existe uma “interface java” para este receptor, identificada como ActionListener que possui a assinatura do método actionPerformed

Este receptor captura o evento e finaliza a aplicação.

public class Finaliza implements ActionListener {

@Overridepublic void actionPerformed(

ActionEvent arg0) {System.exit(1);

}}

JFrame frame = new JFrame ();JButton bt = new JButton ("Diga Ola");frame.setLayout(new FlowLayout());frame.setSize (250,60);frame.add(bt);JButton btFechar = new JButton ("Diga Adeus");btFechar.addActionListener(new Finaliza());frame.add(btFechar);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);

Então, basta adicionar o receptor ao objeto que irá disparar o evento, neste caso o botão fechar.

btFechar.addActionListener(new ActionListener () {public void actionPerformed (ActionEvent ev){

System.exit(1);}

});

Ao invés de declarar uma nova classe, podemos passar um “objeto anonimo” diretamente ao método addActionListener

ATIVIDADE: Faça o botão “Diga Ola” mostrar a seguinte mensagem “Ola”:

JOptionPane.showMessageDialog(null, "Ola !!");

Entendido os conceitos basico, vou apresentar agora uma versão melhora para o mesmo aplicativo.

Usualmente, delegamos a um objeto do tipo Frame toda a tarefa de montar sua interface.

public class PrimeiroSwing extends JFrame {public PrimeiroSwing () {

super();setTitle("Primeiro Swing");JButton bt = new JButton ("Diga Ola");bt.addActionListener(new ActionListener () {

public void actionPerformed (ActionEvent ev){JOptionPane.showMessageDialog(null, "Ola !!");

}});setLayout(new FlowLayout());setSize (250,60);add(bt);JButton btFechar = new JButton ("Diga Adeus");btFechar.addActionListener(new ActionListener () {

public void actionPerformed (ActionEvent ev){System.exit(1);

}});add(btFechar);setDefaultCloseOperation(EXIT_ON_CLOSE);

}}

Classe é responsável por montar

toda a interface

public class SwingOla {public static void main(String[] args) {

// TODO Auto-generated method stubPrimeiroSwing j = new PrimeiroSwing();j.setVisible(true);

}}

Classe teste

Esta aula foi apenas uma apresentação ampla sobre como o Swing funciona.

Entendido como ele funciona, temos que ler e consultar referencias sobre os controles e eventos.

Atividade: Construa a mesma aplicação, só que usando os recursos do Netbeans. Iremos usá-lo para construir nossas

interfaces daqui para frente.

Desenvolva sua própria calculadora de IMC

Atividade: Desenvolva sua própria calculadora de IMC (indice de massa

corpórea)

Para fazer o cálculo do IMC basta dividir seu peso em quilogramas pela altura ao quadrado (em metros). O número que será gerado deve ser comparado aos valores da tabela IMC para se saber se você está abaixo, em seu peso ideal ou acima do peso.

Por exemplo, se você pesa 60Kg e mede 1,67m, você deve utilizar a seguinte fórmula para calcular o IMC:

IMC = 60 ÷ 1,67²IMC = 60 ÷ 2,78IMC = 21,5

Atividade: A interface pode ser baseada no seguinte aplicativo:

Interface Swing com banco de dados

Cadastro de contatos

• Montem a seguinte interface.

• Alterem o nome das variáveis referentes as caixas de textos e botões.

• Usem nomes sugestivos e sigam um “padrão”. Exemplo, btnCadastrar, btnLimpar, txtNome, txtEmail

Codifiquem a ação “Sair”, similar ao que fizemos na aula 8

Evitando fechamento acidental. Peça uma confirmação do usuário.

O Java oferece uma classe que cria este tipo de “caixas”, de mensagem, confirmação e entrada de

usuário.

private void btnSairActionPerformed(java.awt.event.ActionEvent evt)

{int confirm = JOptionPane.showConfirmDialog (this,

"Deseja Realmente fechar a aplicação?", "Sair - Confirmação",

JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (confirm == JOptionPane.YES_OPTION) { System.exit(1); }}

JOptionPane.showMessageDialog (null,"Montando uma caixa de Dialogo sem ícone","Mensagem",JOptionPane.PLAIN_MESSAGE );

int opcao = JOptionPane.showConfirmDialog (null,"Deseja terminar ?","Mensagem Final",JOptionPane.YES_NO_OPTION ,JOptionPane.QUESTION_MESSAGE )

String numero=JOptionPane.showInputDialog (null,"Digite uma informação qualquer”,"Entrada de dados",JOptionPane.QUESTION_MESSAGE );

Defina o “mnemonic” para cada botão. Facilita o uso direto pelo

teclado.

Codifique a ação limpar, como fizemos em aula passada.

Codifique a ação cadastrar. No fim da ação, mostre uma mensagem para o usuário que foi salva com

sucesso.

Vamos usar o banco de dados “contato”, o mesmo utilizado na aula sobre banco de dados (aula

04).

Além disso, usaremos a mesma estrutura. As classes Contato e

ContatoDao.

Contudo, faremos uma classe para abrir a conexão. A

ConnectionFactory

public class ConnectionFactory { public Connection getConnection() { try { return DriverManager.getConnection(

"jdbc:mysql://localhost/Contato_bd", "root", "root");

} catch (SQLException e) { throw new RuntimeException(e); } } }

A ConnectionFactory será usada no construtor da ContatoDAO.

public ContatoDAO() {connection = new

ConnectionFactory().getConnection();}

Depois de testado o aplicativo, substitua o textfield do telefone

por um formattedtextfield.

Inclua os imports ao codigo fonte e codigo para configurar a

mascara em personalizar codigo.

MaskFormatter mascara; try { mascara = new MaskFormatter(

"(##)####-####"); mascara.setPlaceholderCharacter('_'); fmttxtFone.setFormatterFactory (

new DefaultFormatterFactory(mascara)); } catch (ParseException ex) {}

import javax.swing.text.DefaultFormatterFactory;import javax.swing.text.MaskFormatter;

Na próxima aula veremos como carregar dados do banco de dados e o componente JTable

Recommended