Módulo VII – Linguagem Java Entrada e Saída de Dados

Propaganda
Linguagem Java Entrada e Saída de Dados
Especialização Avançada em Sistemas
Distribuídos - EASD
Módulo VII – Linguagem Java
Entrada e Saída de Dados
Marcela Santana e
Sérgio Gorender
Universidade Federal da Bahia
Linguagem Java Entrada e Saída de Dados
Console Padrão
• Saída de Dados
Para que possamos mostrar informações no console padrão (vídeo), é
necessário usar o objeto System.out em conjunto com o método
println().
System.out.println(“Meu primeiro exemplo executável”);
• Entrada de Dados
O Java só permite a entrada de Strings, desta forma, para que
possamos informar valores numéricos é necessário fazer uma conversão
de String para o tipo numérico desejado. A leitura de dados é feita
utilizando um objeto da classe InputStream (fluxo de entrada), ou suas
classes derivadas.
Linguagem Java Entrada e Saída de Dados
Console Padrão
• Entrada de Dados
Para que seja obtido um valor do teclado em um programa Java é necessário
declarar um local de armazenamento. Para que isso seja realizado é
necessário que o programa crie um objeto do tipo BufferedReader, como
pode ser visto (b é um objeto da classe BufferedReader que irá armazenar um
InputStream – fluxo de entrada – lido do console padrão – teclado – como um String):
BufferedReader b = new BufferedReader(new InputStreamReader(System.in));.
A classe BufferedReader tem um método que retorna o valor digitado no
teclado como uma String (métodos read são bloqueantes).
b.readLine();
Quando este valor tem de ser convertido para um tipo primitivo usa-se os
métodos de conversão, como exemplificado a seguir.
int idade = Integer.valueOf( b.readLine() ).intValue();
Linguagem Java Entrada e Saída de Dados
Console Padrão
Todo o programa que se utiliza de entrada e saída de dados do console
padrão deve utilizar o package java.io.*. Ele contêm as classes
responsáveis pelas entradas e saídas de dados e tratamento de
exceções.
Toda a entrada de dados fica sujeita a erros.
A subclasse que trata os erros de entrada e saída é a IOException,
dessa forma é indispensável o seu uso.
import java.io.* // para importar o pacote de entrada e saída
throws java.io.IOException // para tratamento de exceções
Linguagem Java Entrada e Saída de Dados
Console Padrão
• Exemplo de uma classe com entrada de dados pela console padrão
import java.io.*;
public class Palavra {
private String valor;
public void setValor()throws java.io.IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Digite a palavra ");
valor = bf.readLine();
}
public int retornaNumeroLetras(){
return valor.length();
}
public static void main(String[] args) throws java.io.IOException{
Palavra p = new Palavra();
p.setValor();
System.out.println("Esta palavra tem "+p.retornaNumeroLetras()+" letras.");
}
}
Linguagem Java Entrada e Saída de Dados
Interface Gráfica - Swing
• O Swing, faz parte da biblioteca Java Foundation Classes (JFC).
• AWT (Abstract Windows Toolkit) é o antigo conjunto de ferramentas
para interface gráfica em java. O JFC oferece uma interface muito mais
rica.
• É precisa importar java.awt e javax.swing para usar JFC.
• O Swing permite a criação de um programa Java com uma interface que
utiliza o estilo do sistema operacional nativo.
• Todos os componentes do Swing são subclasses da classe JComponent.
Linguagem Java Entrada e Saída de Dados
O primeiro passo de um aplicativo Swing é gerar uma classe que seja uma
subclasse de JFrame (um Frame é uma janela de alto nível).
import java.awt.event.*;
import javax.swing.*;
public class Framework extends JFrame{
public Framework( ){
}
public static void main (String args[]){
Inclui os componentes aqui
JFrame frame = new Framework();
WindowListener l = new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
Tratamento de eventos
};
frame.addWindowListener(l);
frame.pack();
Redimensionar para conter
frame.setVisible(true);
todos componentes e tornar
}
visível o quadro
}
Linguagem Java Entrada e Saída de Dados
• Um objeto JFrame é subdividido em vários painéis diferentes.
• O painel principal é o painel de conteúdo, que representa a área total
de um quadro, ao qual podem ser adicionados componentes. Neste caso
não existe preocupação com o layout dos componentes.
• Para adicionar um componente em um painel de conteúdo é necessário:
1) Criar um objeto JPanel
2) Adicionar todos os componentes ao JPanel, usando o método
add(componente);
3) Transformar esse JPanel no painel de conteúdo, usando o
método setContentPane(panel).
Linguagem Java Entrada e Saída de Dados
Componentes
JLabel
JTextField
JTextArea
JCheckBox
JButton
JComboBox
JOptionPane
Linguagem Java Entrada e Saída de Dados
• Um botão é implementado no Swing através de um objeto JButton. Um
botão pode receber um texto ou imagens.
import java.awt.event.*;
import javax.swing.*;
public class Framework extends JFrame{
public Framework( ){
String nome ="Botao de exemplo";
JButton meuBotao1 = new JButton(nome);
JPanel painel = new JPanel();
painel.add(meuBotao1);
setContentPane(painel);
}
...
Objeto JButton é criado
com um nome
Objeto Jpanel é criado
e o botão é adicionado
a ele
setContentPane é utilizado
para transformar o painel
em painel de conteúdo do
quadro (Frame)
Linguagem Java Entrada e Saída de Dados
• Os rótulos são implementados no Swing como a classe JLabel. São
utilizados para identificar o objetivo de outros componentes em uma
interface.
• Os campos de texto são implementados em Swing com a classe
JTextField, que pode receber como argumento o tamanho do campo de
texto e um valor default.
public Framework( ){
JLabel identificador = new JLabel("Digite seu nome");
JTextField texto = new JTextField(20);
Criação de um label e
JPanel painel = new JPanel();
de um objeto de campo de
painel.add(identificador);
texto (JTextField).
painel.add(texto);
Adiciona o label e depois o
setContentPane(painel);
objeto TextField no painel
}
que é um JPanel
...
Linguagem Java Entrada e Saída de Dados
• As áreas de texto são implementadas no Swing com a classe
JTextArea. Pode receber como argumento o número de linhas
e colunas e também um texto default.
public Framework( ){
JPanel painel = new JPanel();
JLabel idArea = new JLabel("Escreva sua reclamação");
JTextArea area = new JTextArea(10,10);
painel.add(idArea);
painel.add(area);
Criação de um objeto
JTextArea de 10 linhas e
setContentPane(painel);
10 colunas. Foi necessário
}
criar também um rótulo
(label) para identificar o
objetivo do objeto
Linguagem Java Entrada e Saída de Dados
• A classe JCheckBox é a implementação das caixas de seleção no Swing.
public Framework( ){
JCheckBox opcao1 = new JCheckBox("Negrito");
JCheckBox opcao2 = new JCheckBox("Itálico", true);
JPanel painel = new JPanel();
painel.add(opcao1);
painel.add(opcao2);
setContentPane(painel);
}
Criação de dois objetos
JCheckBox sendo que o
objeto opcao2 será por
default selecionado.
Linguagem Java Entrada e Saída de Dados
• Os grupos de caixa de seleção são implementados no Swing com a
classe ButtonGroup. Neste caso apenas um componente pode ser
selecionado.
public Framework( ){
ButtonGroup opcao = new ButtonGroup();
JCheckBox homem = new JCheckBox("Masculino", true);
JCheckBox mulher = new JCheckBox("Feminino", false);
opcao.add(homem);
opcao.add(mulher);
Cria um objeto ButtonGroup
JLabel sexo = new JLabel("Sexo :");
para que este controle que
apenas um dos itens seja
JPanel painel = new JPanel();
selecionado. Em seguida
painel.add(sexo);
adiciona os objetos
painel.add(homem);
JCheckBox ao objeto
painel.add(mulher);
ButtonGroup.
setContentPane(painel);
}
Linguagem Java Entrada e Saída de Dados
• As listas de escolha representam uma das possíveis implementações
da classe JComboBox.
public Framework ( ){
JComboBox lista = new JComboBox();
lista.addItem("Casado");
lista.addItem("Solteiro");
lista.addItem("Divorciado");
lista.addItem("Viuvo");
lista.setEditable(false);
JPanel painel = new JPanel();
painel.add(lista);
setContentPane(painel);
Método que garante que
}
apenas os valores
existentes serão
selecionados
Linguagem Java Entrada e Saída de Dados
• As barras de rolagem são implementadas no Swing com a classe
JScrollBar. Estas aparecem quando o objeto contém mais itens do que
pode ser apresentado. JScrollPane basicamente consiste em
JScrollBars e um Jviewport conforme pode ser visto no desenho
abaixo.
Linguagem Java Entrada e Saída de Dados
public Framework( ){
JPanel painel = new JPanel();
JLabel identificadorArea = new JLabel("Escreva sua reclamação");
JTextArea area = new JTextArea(10,10);
JScrollPane areaRolagem = new JScrollPane(area);
identificadorArea.setLabelFor(areaRolagem);
painel.add(identificadorArea);
painel.add(areaRolagem);
setContentPane(painel);
}
Passa o JTextArea como
parâmetro para criação
do JScrollPane e
adiciona este objeto ao
Pane.
Linguagem Java Entrada e Saída de Dados
JComboBox – Principais métodos
public int getItemCount()
Retorna a quantidade de itens no JComboBox.
public void addItem(String)
Adiciona uma String ao final do JComboBox.
public object getItemAt(int)
Retorna o Objeto na posição indicada por int. Para transformar esse
objeto em uma String use. Ex: (String)Obj.getItemAt(3)
public void insertItemAt(String, int)
Insere a String na posição int.
public object getSelectedItem()
Retorna o objeto selecionado. Para transformar esse objeto em uma
String use. Ex: (String)Obj.getSelectedItem().
Linguagem Java Entrada e Saída de Dados
JLabel – Principais métodos
public void setText(String)
Define a String de informação do rótulo.
JTextField – Principais métodos
public void setText(String)
Define a String do campo de texto.
public String getText()
Lê a String presente no campo de texto.
JCheckBox – Principais métodos
public boolean isSelected()
Determina se a caixa de seleção está Selecionado ou Não.
public void setSelected(boolean)
Marca ou desmarca a caixa de seleção.
ButtonGroup – Principais métodos
public void add(JComponent)
Adiciona o componente ao grupo de botões
Linguagem Java Entrada e Saída de Dados
JTextArea– Principais métodos
public void setText(String)
Define a string da área de texto.
public String getText()
Retorna todas as linhas de uma área de texto como uma única String.
Junta as Linhas; o começo de uma nova linha está sempre no fim da linha anterior.
public void append(String s)
Adiciona a String s ao final da área de texto.
public int getLineCount()
Retorna a quantidade de linhas existente no objeto JTextArea.
JOptionPane– Principais métodos
public static JOptionPane.showMessageDialog(null, String, String,
JOptionPane.ERROR_MESSAGE)
Linguagem Java Entrada e Saída de Dados
Algoritmos de Layout
• Controlam posicionamento e dimensão de componentes.
• Podem ser combinados para obter qualquer configuração.
• Podem ser criados implementando a interface LayoutManager.
• É impossível controlar tamanho e posição de componentes se um
LayoutManager estiver sob controle.
Gerenciadores de Layout
• Um gerenciador de layout determina como os componentes serão
organizados.
• É possível desligar layouts e, neste caso, é preciso definir posição e
tamanho de cada componente.
painel.setLayout(null)
componente.setBounds(x,y, largura, altura)
Linguagem Java Entrada e Saída de Dados
Gerenciadores de Layout - A classe FlowLayout
• Esta classe permite que os componentes fluam da esquerda para a
direita, na ordem em que eles forem inseridos. Quando não há mais
espaço então uma nova linha de componentes começará imediatamente
abaixo da primeira e na ordem da esquerda para a direita, exceto se for
especificado diferente.
• Elementos são apresentados centralizados.
• O “preferred size” é respeitado para todos os componentes.
FlowLayout objetoexemplo = new FlowLayout ();
setLayout(objetoExemplo);
Linguagem Java Entrada e Saída de Dados
Gerenciadores de Layout - A classe GridLayout
• Este gerenciador organiza os componentes em uma grade de linhas e
colunas (elementos de uma tabela). Os componente são incluídos
primeiramente na linha superior da grade, começando da esquerda para
a direita. Quando todas as células estão preenchidas, o próximo
componente será inserido na célula mais a esquerda na segunda linha, se
houver uma segunda linha.
GridLayout objetoexemplo = new GridLayout (3, 2);
setLayout(objetoExemplo);
Linhas e
colunas
Linguagem Java Entrada e Saída de Dados
Gerenciadores de Layout - A classe GridLayout
• Cada célula aceita um componente. Se houver mais células que
componentes, células não preenchidas ficarão em branco.
• Qualquer componente adicionado ocupa toda a célula.
• Ele ignora o “preferred size” dos componentes. Ele estica o
componente até o tamanho da célula.
• Para manter o “preferred size” de um componente, pode-se adicionálo em um componente que o respeita (por exemplo, um que use
FlowLayout) e adicionar este componente em GridLayout.
Linguagem Java Entrada e Saída de Dados
Gerenciadores de Layout - A classe BorderLayout
• Esta classe divide o contêiner em cinco seções: North, South, East,
West, Center.
• As áreas do BorderLayout só aceitam um componente por vez. Se for
necessário mais de um componente é preciso primeiro adicioná-los
dentro de um único componente que então poderá ser adicionado na área
especifica.
• Permite controle detalhado de espaçamento.
BorderLayout objetoexemplo = new BorderLayout (5, 8);
setLayout(objetoExemplo);
Linguagem Java Entrada e Saída de Dados
Gerenciadores de Layout - Classe CardLayout
• Este gerenciador difere dos anteriores porque ele pode ocultar
alguns componentes, mostrando apenas um por vez.
Gerenciadores de Layout - Classe GridBagLayout
• É o mais flexível e complexo dos gerenciadores de Layout. Um
componente pode ocupar mais de uma célula na grade e as proporções
entre as linhas e colunas não precisam ser iguais.
• É um gerenciador de layout mais sofisticado, com amplo controle.
Combinação de Layouts
• Componentes podem ser combinados em recipientes (como JPanel)
para serem tratados como um conjunto.
Linguagem Java Entrada e Saída de Dados
Eventos
• Para transformar uma interface Java em um programa Java que
funcione é necessário tornar a interface receptiva aos eventos do usuário.
• O Swing utiliza um conjunto de classes chamadas de receptores de
eventos.
• Se uma classe quer responder a um evento de usuário no sistema de
tratamento de eventos então é necessário implementar a interface que
trata de eventos. Cada receptor (ouvinte – listener) trata de um tipo
específico de evento e uma classe pode implementar quantos deles forem
necessários.
Linguagem Java Entrada e Saída de Dados
Eventos
• Eventos em Java são objetos da subclasse de java.util.EventObject.
• Todo evento tem um objeto que é sua fonte.
Object fonte= evento.getSource();
• Métodos de ouvintes (listeners) que desejam tratar eventos, recebem
eventos como argumento.
argumento
public void actionPerformed(ActionEvent e) {
Object obSource = e.getSource();
System.out.println(“O evento ocorreu em ” + obSource.toString());
}
• Ouvintes precisam ser registrados nas fontes.
botao.addActionListener(ouvinte);
/*neste caso o ouvinte deve ter o método da interface ActionListener,
public void actionPerformed(ActionEvent e) implementado. */
Linguagem Java Entrada e Saída de Dados
Eventos
• Divididos em categorias.
• ActionEvent (fonte: componentes de ação)
• MouseEvent (fonte: componentes afetados pelo mouse)
• ItemEvent (fonte: checkboxes e similares)
• TextEvent (fonte: componentes de texto)
• WindowsEvent (fonte: janelas)
• FocusEvent (fonte: componentes em geral)
• KeyEvent (fonte: componentes afetados pelo teclado)
• e outros
Linguagem Java Entrada e Saída de Dados
Eventos
• Cada evento tem uma interface Listener correspondente que possui
métodos padrão para tratá-lo.
• ActionEvent :
Interface ActionListener
• MouseEvent :
Interface MouseListener
• ItemEvent :
Interface ItemListener
• TextEvent :
Interface TextListener
• WindowsEvent : Interface WindowsListener
• FocusEvent :
Interface FocusListener
• KeyEvent :
Interface KeyListener
(segue um padrão)
• XXXEvent :
Interface XXXListener
Linguagem Java Entrada e Saída de Dados
Eventos - interface Listener
1) ActionListener - Eventos de ação, que são gerados por um usuário
agindo sobre um componente, como um clique de mouse em um botão.
2)FocusListener - Eventos de foco de teclado, como um campo de texto
que recebe ou perde foco.
3) ItemListener - Eventos de item, como um item de caixa de seleção é
alterado.
4) KeyListener - Eventos de teclado quando um usuário digita texto no
teclado.
Linguagem Java Entrada e Saída de Dados
Eventos - interface Listener
5) MouseListener - Eventos de mouse, entrando na área de um
componente e deixando a área de um componente.
6) MouseMotionListener - Eventos de movimento de mouse, que são
usados para controlar toda a movimentação de um mouse sobre
componente.
7) WindowsListener - Eventos de janela, que são gerados por uma janela,
como quando a janela principal é maximizada, minimizada ou fechada.
Linguagem Java Entrada e Saída de Dados
Eventos
• A classe ouvinte tem de implementar o(s) listener(s) desejado(s).
public class MinhaClasse implements ActionListener, FocusListener {
• A classe ouvinte precisa implementar os métodos das interfaces
Listener que ela declarou.
public void actionPerformed (ActionEvent e) { } Interface ActionListener
public void focusGained (ItemEvent evt ){ }
Interface FocusListener
public void focusLost (ItemEvent evt ){ }
Interface FocusListener
• Alguns listeners possuem uma classe Adapter que implementa todos os
métodos, sem instruções. Só existe para listeners que tenham mais de um
método.
Linguagem Java Entrada e Saída de Dados
Eventos
• Depois que um componente que deve receber o evento (fonte) for
criado é necessário que o receptor seja incluído como ouvinte.
Assim, após a criação de um componente (fonte), os seguintes métodos
podem ser associados a ele:
addActionListener( ), addAdjustmentListener( ),
addFocusListener(), addItemListener( ), addKeyListener( ),
addMouseListener( ), addMouseMotionListener( ),
addWindowsListener( ).
O exemplo a seguir cria um objeto JButton e associa um receptor de
evento de ação a ele:
Jbutton botao = new Jbutton(“Nome do botao”);
botao.addActionListener(this);
O this indica que a classe atual
é a receptora do evento, ou
seja é a ouvinte
Linguagem Java Entrada e Saída de Dados
• Se mais de um componente da classe possuir um receptor de evento de
ação, é necessário descobrir qual deles foi usado e então agir de acordo
com as ações do programa.
• O objeto ActionEvent pode ser usado para descobrir detalhes a
respeito do componente que gerou o evento.
• Pode descobrir o tipo do objeto (pelo nome do objeto) ou então o tipo do
componente que foi acionado (JTextField, JButton, etc)
Linguagem Java Entrada e Saída de Dados
Pelo nome do Objeto
public void actionPerformed(ActionEvent evt){
Objeto src = evt.getSource( );
if (src == nomeObjeto){
// código de tratamento
} else {
Exemplos de
// código de tratamento
Eventos de Ação
}
}
Pelo tipo do Componente
public void actionPerformed(ActionEvent evt){
Objeto src = evt.getSource( );
if (src instanceof JButton){
Sobre: (JButton,
// código de tratamento
JCheckBox, JComboBox,
} else {
JTextField ou
// código de tratamento
JRadioButton)
}
}
Linguagem Java Entrada e Saída de Dados
Eventos - Adapter
• Facilitam a implementação de classes tratadoras de eventos.
• O programador não precisa implementar todos os métodos da
interface.
• Adaptadoras implementam as interfaces, tendo métodos vazios para
cada um dos métodos da interface
• Definir uma subclasse de adapter redefinindo os métodos que
interessam.
• O nome do adapter é semelhante ao do Listener.
MouseListener :
MouseAdapter
WindowListener:
WindowAdapter, ....
Linguagem Java Entrada e Saída de Dados
Eventos – Não usando Adapter
interface WindowListener {
public void windowActivated(WindowEvent evt);
public void windowClosed(WindowEvent evt);
public void windowClosing(WindowEvent evt);
public void windowDeactivated(WindowEvent evt);
public void windowDeiconified(WindowEvent evt);
public void windowIconified(WindowEvent evt);
public void windowOpened(WindowEvent evt);
}
Public class MinhaClasse implements WindowListener {
public void windowActivated(WindowEvent evt) {/* código da classe */}
public void windowClosed(WindowEvent evt) {/* código da classe */}
public void windowClosing(WindowEvent evt) {/* código da classe */}
public void windowDeactivated(WindowEvent evt) {/* código da classe */}
public void windowDeiconified(WindowEvent evt) {/* código da classe */}
public void windowIconified(WindowEvent evt) {/* código da classe */}
public void windowOpened(WindowEvent evt) {/* código da classe */}
}
Linguagem Java Entrada e Saída de Dados
Eventos – Usando Adapter
interface WindowListener {
public void windowActivated(WindowEvent evt);
public void windowClosed(WindowEvent evt);
Só interessa ter
public void windowClosing(WindowEvent evt);
implementação para
public void windowDeactivated(WindowEvent evt);
este método na
public void windowDeiconified(WindowEvent evt);
classe MinhaClasse.
public void windowIconified(WindowEvent evt);
O uso do Adapter
public void windowOpened(WindowEvent evt);
WindowAdapter
}
permite isso.
public class MinhaClasse extends Frame {
public MinhaClasse() {
this.setTitle("Usando um Window Adapter");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
this.pack();
this.show();
}
Download