Interface Gráfica com o Usuário (GUI) GUI (Graphical User Interface)

Propaganda
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa. Luciana Nedel e do Prof. Julio Machado)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
GUI (Graphical User Interface)
▐
Bibliotecas de classes Java
■ Possuem muitas funcionalidades para prover a
comunicação homem-máquina gráfica
▐
Os elementos básicos necessários para criar uma
interface gráfica, ou GUI, residem em dois pacotes:
■ java.awt: Abstract Windowing Toolkit (classes básicas)
■ javax.swing: Swing Components (criado em 1997)
1
▐
GUI (Graphical User Interface)
AWT x Swing
AWT é o conjunto original de componentes visuais de Java.
Swing é uma extensão da AWT, implementado inteiramente em
Java ao contrário da AWT que é implementada com métodos
nativos
• Componentes GUI da AWT estão diretamente associados com as
capacidades de GUI da plataforma local.
• Programa Java (GUI da AWT) executando em diferentes plataformas Java
tem uma aparência diferente
Swing possui a mesma estrutura que os componentes AWT, mas
apresenta componentes mais flexíveis.
• JButton (Swing) no lugar de Button (AWT),
• JFrame (Swing) no lugar de Frame (AWT), etc.
As classes Swing são parte de um conjunto mais genérico de
capacidades gráficas, chamado de Java Foundation Classes (JFC).
GUI (Graphical User Interface)
Exemplo 1:
import javax.swing.*;
public class TestaJanela {
public TestaJanela() {
// Cria objeto "janela"
JFrame janela = new JFrame("Título da janela");
janela.setBounds(50,100,400,150);//Seta posicao e tamanho
janela.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
janela.setVisible(true); // Exibe a janela
}
public static void main (String args[]) {
TestaJanela t = new TestaJanela();
}
}
Argumentos do método setDefaultCloseOperation:
DISPOSE_ON_CLOSE - Destrói a janela
DO_NOTHING_ON_CLOSE - Desabilita opção
HIDE_ON_CLOSE - Apenas fecha a janela
2
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa: Luciana Nedel)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
Containers e Componentes
▐
Uma interface gráfica em Java é baseada em dois
elementos:
■ Containers
Servem para agrupar e exibir outros componentes
■ Componentes
São os botões, labels, scrollbars, etc.
3
Containers e Componentes
▐
Portanto, todo programa que ofereça uma interface vai
possuir pelo menos um container, que pode ser:
■ JFrame
• Janela principal de uma aplicação
• Um objeto desta classe possui uma barra de título e características para
receber menus e outros componentes
■ JDialog
• Usada para definir janelas de diálogo para entrada de dados
• Normalmente usada em resposta a uma opção de menu selecionada
• Definida em função de um objeto JFrame
■ JApplet
• Janela para Applets (classe base para applets Java)
• É possível desenhar e adicionar menus e outros componentes em um
JApplet
Containers e Componentes
▐
Componentes swing são divididos em:
■ Visuais:
botões, menus, barras de ferramentas, etc.
■ Não-visuais, de auxílio aos outros:
▐
root pane, panel, layered pane, etc.
Pacote javax.swing
■ import javax.swing.*;
■ Composto de várias classes
4
Containers e Componentes
▐
▐
Para construirmos uma interface gráfica em JAVA,
adicionamos componentes (botões, menus, textos,
tabelas, listas, etc.) sobre a área da janela.
Por essa razão a área da janela é um container, ou
seja, um elemento capaz de armazenar uma lista
de componentes.
Containers e Componentes
5
Containers e Componentes
Exemplo 2:
import javax.swing.*;
import java.awt.*;
public class TestaJanela
{
public TestaJanela() {
// Cria objeto "janela"
JFrame janela = new JFrame("Título da janela");
janela.setBounds(50,100,400,150); //Seta posicao e tamanho
janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
FlowLayout flow = new FlowLayout(); // Cria objeto para definir o layout
Container caixa=janela.getContentPane();// Obtém container associado à janela
caixa.setLayout(flow); // Define o layout do container
for (int i=1; i<=6; i++)
caixa.add(new JButton("Aperte " + i));// Adiciona um botão
janela.setVisible(true); // Exibe a janela
}
public static void main (String args[]) {
TestaJanela t = new TestaJanela();
}
}
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa: Luciana Nedel)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
6
Hierarquia de Classes
▐
Uma janela em Java é representada por um objeto
da classe Window.
java.lang
Object
Component Define um componente (botão, scrollbar, etc).
Container
java.awt
Window
javax.swing
Define um componente que pode conter outros
componentes.
Define uma janela básica sem barra de título ou borda.
Frame
Define uma janela com barra de título e borda.
JFrame
Estende potencialidades do Frame.
Hierarquia de Classes
Object
Label
Button
Component
List
Container
Panel
(container velho)
Applet
...
TextField
JComponent
Window
Frame
TextArea
TextComponent
(componentes Swing)
JLabel
JButton
JList
JTextComponent
JTextArea
JTextField
...
Dialog
JWindow
(sem bordas nem barra de título)
JApplet
JFrame
JDialog
7
Hierarquia de Classes
▐
Algumas classes da hierarquia são bastante
simples, outras são complexas
▐
JFrame, por exemplo:
■ 2 construtores, 236 métodos
23 métodos declarados
17 métodos herdados de Frame
19 métodos herdados de Window
44 métodos herdados de Container
124 métodos herdados de Component
9 métodos herdados de Object
Hierarquia de Classes
▐
Não é possível dominar as facilidades da
linguagem com a mesma velocidade com que se
domina os comandos de uma linguagem
procedural
▐
Uso da documentação da API durante a
programação é rotineiro e essencial
8
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa: Luciana Nedel)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
Exemplo: uma janela simples…
▐
Executando a classe abaixo…
import javax.swing.*;
public class SimpleFrame
{
public SimpleFrame() {
JFrame frame = new JFrame("Aplicacao Swing");
JButton but = new JButton("Botão Swing");
JLabel texto = new JLabel("Numero de cliques no botão: 0");
JPanel painel = new JPanel();
painel.add(but);
painel.add(texto);
frame.getContentPane().add(painel);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
SimpleFrame sf = new SimpleFrame();
}
}
9
Exemplo: uma janela simples…
▐
A aplicação do exemplo anterior possui os
seguintes elementos:
■ JFrame: armazena os demais componentes
■ JPanel: painel, serve para facilitar o posicionamento do
botão e do label
■ JButton
■ JLabel
Exemplo: uma janela simples…
▐
▐
▐
JFrames são top-level containers
■ Sempre estão presentes
JPanels são intermediate containers (ou generalpurpose containers)
■ Podem estar ou não presentes (mas geralmente estão)
JButton e JLabel são componentes atômicos
(Basic Controls e Uneditable Information Displays)
■ Não podem ser usados para conter e normalmente
respondem ao usuário
10
Exemplo: uma janela simples…
▐
▐
Questões ainda não respondidas:
■ Como organizar os componentes em um JPanel?
■ Java oferece diversos layouts para estruturação de
componentes
■ Por exemplo, para JPanel o layout default é
FlowLayout, que distribui os componentes na horizontal
Mas, e se quisermos distribuir de outro modo?
■ Basta trocar o layout por outro!
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa: Luciana Nedel)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
11
Layouts
▐
▐
▐
Filosofia da linguagem Java
■ Programas extremamente portáveis
Filosofia da interface gráfica
■ Visa também ser extremamente adaptável
Disposição dos Components sobre o Container
■ Não é indicada por um par ordenado (x,y)
■ Determinada a partir de Layouts
Java oferece um conjunto de Layouts básicos
É possível definir Layouts próprios
Layouts
▐
O arranjo dos componentes no container é
gerenciado por um LayoutManager
■ Vantagem
Apresentação dos componentes se adapta quando do
redimensionamento da janela
■ Desvantagem
Pouco domínio que o programador tem da posição dos
componentes com alguns LayoutManagers
12
FlowLayout
▐
Os components são distribuídos da esquerda para a
direita e de cima para baixo
▐
Respeita o tamanho preferido dos componentes
mesmo quando não houver espaço suficiente no
container
▐
Componentes podem ser centralizados
(FlowLayout.CENTER), alinhados a esquerda
(FlowLayout.LEFT) ou alinhados a direita
(FlowLayout.RIGHT)
■ Default: centralizado
▐
FlowLayout
Exemplo:
import javax.swing.*;
import java.awt.*;
public class TestaJanela {
public TestaJanela() {
JFrame janela = new JFrame("Título da janela");
janela.setBounds(50,100,200,150); //Seta posicao e tamanho
janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
FlowLayout flow = new FlowLayout(FlowLayout.CENTER);
Container caixa = janela.getContentPane();
JPanel painel =new JPanel();
painel.setLayout(flow);
painel.add(new JLabel("Clique no botão"));
painel.add(new JButton("Botão"));
painel.add(new JLabel("Digite o seu nome"));
painel.add(new JTextField(10));
caixa.add(painel);
janela.setVisible(true); // Exibe a janela
}
public static void main (String args[]) { TestaJanela t = new TestaJanela(); }
}
13
GridLayout
▐
Similar ao FlowLayout, mas cada component é alocado em uma
célula de igual tamanho. Permite definir um vetor ou matriz de
células nas quais os componentes são alocados.
...
janela.setBounds(50,100,300,150);
janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridLayout grid = new GridLayout(2,2);
Container caixa = janela.getContentPane();
JPanel painel =new JPanel();
painel.setLayout(grid);
...
▐
Divide a área em uma grade
▐
Dispõe os elementos da esquerda para a direita e de cima para
baixo
▐
Todos tem o mesmo tamanho
GridLayout
import javax.swing.*;
import java.awt.*;
public class AplicacaoGrafica extends JFrame {
private JButton butOK;
private JTextField campo1,campo2,resp;
private JLabel texto1,texto2;
public AplicacaoGrafica() {
super("Aplicacao grafica simples");
Container c = getContentPane();
texto1 = new JLabel("Nome:");
campo1 = new JTextField(15);
texto2 = new JLabel("Fone:");
campo2 = new JTextField(15);
butOK
= new JButton("OK");
resp
= new JTextField(15);
c.setLayout(new GridLayout(3,2));
c.add(texto1); c.add(campo1);
c.add(texto2); c.add(campo2);
c.add(butOK); c.add(resp);
pack();
}
public static void main(String args[]) {
AplicacaoGrafica ag=new AplicacaoGrafica();
ag.setVisible(true);
}
}
14
GridBagLayout
▐
Semelhante ao GridLayout, porém as divisões
podem ter tamanhos diferentes
▐
Utiliza a classe GridBagConstraints para
dimensionar e posicionar os componentes
▐
Um layout flexível e complicado usado quando
nenhum dos outros se aplica
BorderLayout
▐
▐
Layout default para a maioria das aplicações gráficas.
Quando se adiciona um componente, é necessário
especificar em qual das áreas ele deve ser adicionado.
■ Ex: add(butOK, BorderLayout.WEST);
Divide um container em cinco regiões
■ BorderLayout.CENTER
■ BorderLayout.NORTH
■ BorderLayout.EAST
West
■ BorderLayout.SOUTH
■ BorderLayout. WEST
North
Center
East
South
15
BorderLayout
...
BorderLayout border = new BorderLayout();
Container caixa = janela.getContentPane();
JPanel painel =new JPanel();
painel.setLayout(border);
painel.add(new JButton("Botão Norte"), BorderLayout.NORTH);
painel.add(new JButton("Botão Sul"), BorderLayout.SOUTH);
painel.add(new JTextField(10), BorderLayout.WEST);
painel.add(new JTextField(10), BorderLayout.EAST);
painel.add(new JButton("Botão Central"), BorderLayout.CENTER);
caixa.add(painel);
//janela.pack();
...
CardLayout
▐
▐
Usado para exibir um componente de cada vez como
em uma pilha de cartas
Somente o objeto que estiver no topo será visível
Em geral é controlado por um combo box cujo estado determina
qual panel o CardLayout irá exibir
Métodos:
■ first(Container), last(Container),
■ next(Container), previous(Container),
■ show(Container, String)
16
CardLayout
BoxLayout
▐
Respeita o tamanho dos componentes
▐
Coloca os componentes em uma linha ou coluna
■ BoxLayout.X_AXIS para componentes em linha
■ BoxLayout.Y_AXIS para componentes em coluna
...
janela.setBounds(50,100,200,120);
janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_
CLOSE);
Container caixa = janela.getContentPane();
JPanel painel =new JPanel();
BoxLayout box = new BoxLayout(painel,BoxLayout.Y_AXIS);
painel.setLayout(box);
painel.add(new JLabel("Clique no botão"));
painel.add(new JButton("Botão"));
painel.add(new JLabel("Digite o seu nome"));
painel.add(new JTextField(10));
...
17
Layouts
▐
Compondo layouts usando panels
■ A classe Panel/JPanel é derivada de Container e pode
ser usada para agrupar Components de maneira a criar
Layouts compostos.
■ Por ser também um Container, um Panel/JPanel pode ter
seu Layout próprio.
■ Como um Container pode conter outros Containers,
podemos agrupar vários Components em um
Panel/JPanel e passar a considerá-los como um único
Component para efeitos de layout.
Layouts
▐
Compondo layouts usando panels
■ Veja os códigos a seguir que exibem os seguintes
diálogos:
Exemplo 1:
Compondo Layouts
usando a AWT
Exemplo 2:
Compondo Layouts
usando a Swing
18
import java.awt.*;
public class AplicacaoGraficaAwt extends Frame{
private Button butOK;
private TextField campo1,campo2,campoR;
private Label texto1,texto2,textoR;
private Panel p1 = new Panel();
private Panel p2 = new Panel();
public AplicacaoGraficaAwt() {
super("Aplicacao grafica simples");
// Cria os componentes
texto1 = new Label("Nome:"); campo1 = new TextField(15);
texto2 = new Label("Fone:"); campo2 = new TextField(15);
butOK
= new Button("OK");
textoR = new Label("Resp:"); campoR = new TextField(20);
// Define o layout do container básico
setLayout(new GridLayout(2,1));
// Define o layout dos Panels
p1.setLayout(new GridLayout(2,2));
p2.setLayout(new FlowLayout(FlowLayout.CENTER));
// Adiciona os componentes aos panels
p1.add(texto1); p1.add(campo1);
p1.add(texto2); p1.add(campo2);
p2.add(butOK);
p2.add(textoR); p2.add(campoR);
// Adiciona os panels ao container básico
add(p1); add(p2);
}
public static void main(String args[]) {
AplicacaoGraficaAwt ag = new AplicacaoGraficaAwt();
ag.pack(); ag.setVisible(true);
}
}
Exemplo 1:
Compondo Layouts
usando a AWT
import javax.swing.*;
import java.awt.*;
public class AplicacaoGraficaSwing extends JFrame{
private JButton butOK;
private JTextField campo1,campo2,campoR;
private JLabel texto1,texto2,textoR;
private JPanel p1 = new JPanel();
private JPanel p2 = new JPanel();
public AplicacaoGraficaSwing() {
super("Aplicacao grafica simples");
Container c = getContentPane();
// Cria os componentes
texto1=new JLabel("Nome:"); campo1=new JTextField(15);
texto2=new JLabel("Fone:"); campo2=new JTextField(15);
butOK=new JButton("OK"); textoR=new JLabel("Resp:"); campoR=new JTextField(20);
// Define o layout do container básico
c.setLayout(new GridLayout(2,1));
// Define o layout dos Panels
p1.setLayout(new GridLayout(2,2));
p2.setLayout(new FlowLayout(FlowLayout.CENTER));
// Adiciona os componentes aos panels
p1.add(texto1); p1.add(campo1); p1.add(texto2); p1.add(campo2);
p2.add(butOK); p2.add(textoR); p2.add(campoR);
// Adiciona os panels ao container básico
c.add(p1); c.add(p2);
}
public static void main(String args[]) {
AplicacaoGraficaSwing ag = new AplicacaoGraficaSwing();
ag.pack(); ag.setVisible(true);
}
}
Exemplo 2:
Compondo Layouts
usando a Swing
19
Interface Gráfica com o Usuário (GUI)
Profa. Isabel Harb Manssour
(Material adaptado das aulas da Profa: Luciana Nedel)
▐
▐
▐
▐
▐
▐
GUI (Graphical User Interface)
Containers e Componentes
Hierarquia de Classes
Exemplo
Layouts
Definindo Janelas
Definindo Janelas
▐
Várias maneiras de definir as janelas:
■ Toda a definição dentro de um método main (péssima
prática de programação)
■ Definir uma classe que herda de JFrame e utilizar um
objeto dessa classe como a janela.
■ Definir uma classe que herda de JPanel e utilizar um
objeto dessa classe dentro de um objeto JFrame.
20
Definindo Janelas
▐
Situação 1:
public class Situacao1{
public static void main(String[] args) {
JFrame frame = new JFrame();
...//adicionar containers e components
frame.pack();
frame.setVisible(true);
}
}
Definindo Janelas
▐
Situação 2:
public class Situacao2 extends JFrame{
public Situacao2(){
super("Titulo"); //Construtor de Jframe
... //adicionar containers e components
}
}
public class TesteSituacao2{
public static void main(String[] args) {
Situacao2 frame = new Situacao2();
frame.pack();
frame.setVisible(true);
}
}
21
Definindo Janelas
▐
Situação 3:
public class Situacao3 extends JPanel{
public Situacao3(){
...//adicionar containers e components
}
}
public class TesteSituacao3{
public static void main(String[] args) {
JFrame frame = new JFrame("Titulo");
frame.getContentPane().add(new Situacao3());
frame.pack();
frame.setVisible(true);
}
}
Exercício
▐
Complete o código abaixo para que seja criada uma interface com a mesma
aparência da apresentada na figura abaixo. O código responsável pela
organização da aparência da janela corresponde ao método montaInterface
cujo conteúdo foi deliberadamente omitido. Crie também uma classe que
implemente o método main e crie uma instância desta classe.
import java.awt.*;
import javax.swing.*;
class AplicacaoGrafica extends JFrame {
private JButton b1 = new JButton("Botao 1");
private JButton b2 = new JButton("Botao 2");
private JTextField tf = new JTextField(15);
public void montaInterface() { ... }
public AplicacaoGrafica() {
super("Aplicacao grafica simples");
montaInterface();
pack();
setVisible(true);
}
}
22
Download