Java - Swing Raphaela Galhardo raphaela@j2eebrasil.com.br http://www.j2eebrasil.com.br http://javarn.dev.java.net
Conteúdo Interface com Usuário; Eventos; Swing.
Introdução Interface com Usuário Grande Importância; Fornece ao programa uma aparência; Web; Gráfica (Swing).
Interface Gráfica Implementação envolve três passos: Instanciar componentes da interface Janelas, botões, campos de textos, etc. Adicionar os componentes ao container Um container é um repositório para elementos gráficos. Os principais são: Window(JFrame e JDialog) e Panel. Estabelecer o tratamento de eventos da interface Por ex., o que deve acontecer quando o usuário clica em um botão, ou se o usuário digita alguma coisa em um campo de texto, etc.
Swing javax.swing.*
Swing Componentes: Objetos visuais ou não visuais que podem interagir com o usuário; JCheckBox, JButton, JRadioButton.
Swing Containers: Descendentes de java.awt.container; Contém objetos visuais; Recebe os componentes criados; Utilizam gerenciador de Layout; Containers podem conter containers; JFrame, JApplet, JPanel, JScroolPane; Todos os containers são componentes, mas nem todos os componentes são containers; Um container (painel) pode ser inserido dentro de outro.
Swing Classe: javax.swing.jframe; Um objeto JFrame representa uma janela do sistema gráfico. Possui barra de título e bordas; Pode ser formado por diversos componentes: Botões (JButton); Radio buttons (JRadioButton); CheckBox (JCheckBox); Labels (JLabel); Campo texto (JTextField); Campo texto com várias linhas (JTextArea); Tabelas (JTable); etc.
Componentes Gráficos javax.swing.jbutton javax.swing.jcheckbox
Componentes Gráficos javax.swing.jradiobutton javax.swing.jcombobox
Componentes Gráficos javax.swing.jlabel javax.swing.jtextfield
Componentes Gráficos javax.swing.jlist
Componentes Gráficos javax.swing.jmenubar javax.swing.jmenu javax.swing.jmenuitem
Interface Gráfica Primeiro Exemplo. Arquivo SimpleGui1.java: import javax.swing.*; //Importa pacote swing public class SimpleGui1 { public static void main(string[] args) { JFrame frame = new JFrame(); //Cria Janela //Cria botão com texto "Clique Aqui" JButton button = new JButton("Clique Aqui"); //Finaliza o programa se a janela for fechada frame.setdefaultcloseoperation(jframe.exit_on_close); //Adiciona o botão à janela frame.getcontentpane().add(button); //Define a largura e a altura da janela em pixel frame.setsize(200, 300); //Permite a visualização da janela frame.setvisible(true);
Interface Gráfica Execução: java SimpleGui1 Exibe janela com um botão ocupando todo o espaço; Quando clica no botão, nada acontece. Apenas mostra que ele está sendo clicado.
Interface Gráfica O que fazer para algo executar quando o botão tiver sido clicado??? Necessitamos de duas coisa: Um método que execute a ação; Algo que identifique que o botão foi clicado: EVENTO.
Interface Gráfica Deseja-se que quando o botão for clicado o texto dele altere para Botão Clicado. 1º Passo: Escrever método que altere o texto do botão: public void mudatexto(){ button.settext( Botão Clicado ); Como saber quando o método deve ser executado? Como saber que o botão foi clicado? Tratamento de Evento do Usuário
Evento Comunicação do mundo externo para o programa que alguma coisa aconteceu; Programa passa a ser chamado quando algum evento é gerado na interface. Chamada a partir do registro de métodos para cada evento da interface que se deseja tratar.
Evento Exemplos de Eventos: Clique no botão; Botão está sendo pressionado; Botão está sendo solto; Clique do mouse; Digitar um campo de texto; Fechar janela; Selecionar um item do menu; Movimento do Mouse; Etc.
Eventos Tratamento de Eventos: 1º) O botão precisa saber que deve informar que ele foi clicado; 2º) O botão precisa de um caminho para chamar seu código de volta quando um evento de clique acontece. 1º) Ei. Botão! Interessa-me saber o que acontece a você 2º) O usuário me clicou!
Eventos Para saber dos eventos do botão, implemente uma interface que diz: Eu estou esperando por seus eventos ; Uma interface listener(ouvinte) é a ponte entre o que espera um evento (seu código) e o acontecimento do evento (botão).
Eventos Quando seu código implementa a interface listener, você informa ao botão um caminho de volta a seu código. Na interface, é onde o método a ser executado é declarado.
Eventos ActionListener: permite o tratamento de eventos que representam ações do usuário, tais como em objetos das classes JButton, JMenuBar outras; ItemListener: permite o tratamento de eventos que representam ações do usuário sobre objetos que significam itens de um menu, tais como em objetos das classes JCheckBox, JRadioButton, JComboBox e outras; MouseListener: permite o tratamento de eventos do mouse, tais como clicks, coordenadas e outros;
Eventos MouseMotionListener: permite o tratamento de eventos de movimento do mouse; KeyListener: permite o tratamento de eventos do teclado; WindowListener: permite o tratamento de eventos padronizados para objetos da classe JFrame.
Eventos Evento: Representado como Objeto; Passado para métodos do listener, descrevendo o evento ocorrido; Pacote: java.awt.event Grupo de Eventos: MouseEvent KeyEvent WindowEvent ActionEvent Outros.
Eventos
Eventos Obtendo um evento (ActionEvent) de um botão: Implemente a interface ActionListener; Registre-se com o botão, informando que deseja esperar por eventos; Defina um método para tratamento do evento, implementando o método actionperformed() da interface ActionListener.
Eventos import java.awt.event.*; import javax.swing.*; public class SimpleGui2 implements ActionListener{ //Declara botão como variável global JButton button; public void go() { JFrame frame = new JFrame(); //Cria Janela //Instancia botão com texto "Clique Aqui" button = new JButton("Clique Aqui"); /* Registra o interesse de ser informado sobre os eventos * que ocorrem no botão. this = objeto da classe SimpleGui2 */ button.addactionlistener(this); frame.getcontentpane().add(button); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setsize(300, 300); frame.setvisible(true); //...
Eventos //... Continuação da classe SimpleGui2 /** Método que realiza o tratamento de evento. O botão invoca * este método passando um objeto ActionEvent como argumento.*/ public void actionperformed(actionevent e) { //Na ocorrência de um evento, trocar texto do botão button.settext("fui clicado"); //Método principal public static void main(string[] args) { SimpleGui2 gui = new SimpleGui2(); gui.go();
Eventos Execução do exemplo da classe SimpleGui2
JPanel JPanel: Área dedicada de desenho; Pode ser extendida para criação de novos componentes; Códigos dos gráficos dentro do método paintcomponente(graphics g) que deve ser reescrito.
JPanel 1º Exemplo import java.awt.color; import java.awt.graphics; import javax.swing.jpanel; /**SubClasse de JPanel.Componente que pode ser adicionado a um frame*/ public class ExPanel1 extends JPanel{ //Método que não será invocado pelo programador,chamado automaticamente public void paintcomponent(graphics g){ //g será o objeto para desenho //Define a cor da área gráfica a ser desenhada g.setcolor(color.orange); //Desenha retângulo começando nas coordenadas //x = 20 e y = 50, largura 150 e altura 100 píxels g.fillrect(20, 50, 150, 100);
JPanel 2º Exemplo import java.awt.graphics; import java.awt.image; import javax.swing.imageicon; import javax.swing.jpanel; public class ExPanel2 extends JPanel{ public void paintcomponent(graphics g){ //Cria objeto Image com o caminho da imagem Image imagem = new ImageIcon( getclass().getresource( /figuras/sic.gif )).getimage(); //Desenha imagem na tela, iniciando nas coordenadas x=10 e y=20 g.drawimage(imagem, 100, 100, this);
JPanel 3º Exemplo import java.awt.*; import javax.swing.jpanel; public class ExPanel3 extends JPanel{ public void paintcomponent(graphics g){ /* Desenha retângulo começando nas posições x = 0, y = 0 * A largura será igual a largura definida para a janela(this.getwidth()). * A altura será igual a altura definida para a janela(this.getheight()) * Retângulo desenhado em preto, já que nenhuma cor foi predefinida */ g.fillrect(0, 0, this.getwidth(), this.getheight()); //Define valores para a cor de forma aleatória int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); //Cria cor de acordo com os valores aleatórios Color randomcolor = new Color(red, green, blue); //Define cor aleatória para próximo desenho g.setcolor(randomcolor); //Desenha círculo começando nas posíções //x = 170 e y = 120 de largura = altura = 100 g.filloval(170, 120, 100, 100); //Define cor para próximo desenho g.setcolor(color.cyan); //Desenha um retângulo com impressão tridimensional g.draw3drect(3, 4, 100, 100, true);
JPanel Exibição import java.awt.borderlayout; import javax.swing.jframe; public class SimpleGui3{ //Declara frame como variável global JFrame frame; public void go() { frame = new JFrame(); frame.setdefaultcloseoperation(jframe.exit_on_close); ExPanel1 ep1 = new ExPanel1(); ExPanel2 ep2 = new ExPanel2(); ExPanel3 ep3 = new ExPanel3(); //Panel desenhado na posição central da janela frame.getcontentpane().add(borderlayout.center, ep1); frame.setsize(300, 300); frame.setvisible(true); public static void main(string[] args) { SimpleGui3 gui = new SimpleGui3(); gui.go();
JPanel Exibição 1º Panel
JPanel Exibição 2º Panel
JPanel Exibição 3º Panel
Gerenciadores de Layout Gerenciador de Layout: organiza os componentes GUI para apresentação; Não podemos posicionar os elementos através de coordenadas; Determinam o tamanho e a posição dos componentes na janela gráfica do programa; Posicionam Elementos seguindo uma regra.
Gerenciadores de Layout JPanel panela = new JPanel(); JPanel panelb = new JPanel(); panelb.add(new JButton( button 1 ); panelb.add(new JButton( button 2 ); panelb.add(new JButton( button 3 ); panela.add(panelb);
Gerenciadores de Layout Principais Gerenciadores: FlowLayout: coloca os componentes seqüencialmente da esquerda para a direita na ordem em que foram adicionados. BorderLayout: organiza os componentes em cinco áreas: norte, sul, leste, oeste e centro. BoxLayout: organiza componentes um abaixo do outro. GridLayout: organiza os componentes nas linhas e colunas.
Gerenciadores de Layout FlowLayout
Gerenciadores de Layout BorderLayout
Gerenciadores de Layout BoxLayout
Gerenciadores de Layout GridLayout
BorderLayout 1º Exemplo import java.awt.borderlayout; import javax.swing.*; public class Button1 { public void go(){ JFrame frame = new JFrame(); JButton button = new JButton("Clique Aqui"); frame.getcontentpane().add(borderlayout.east, button); frame.setsize(200, 200); frame.setvisible(true); public static void main(string[] args) { Button1 gui = new Button1(); gui.go();
BorderLayout 2º Exemplo import java.awt.borderlayout; import javax.swing.*; public class Button1 { public void go(){ JFrame frame = new JFrame(); JButton button = new JButton("Clique Aqui"); frame.getcontentpane().add(borderlayout.north, button); frame.setsize(200, 200); frame.setvisible(true); public static void main(string[] args) { Button1 gui = new Button1(); gui.go();
BorderLayout 3º Exemplo import java.awt.borderlayout; import javax.swing.*; public class Button1 { public void go(){ JFrame frame = new JFrame(); JButton button = new JButton("Clique Aqui"); Font f = new Font("srif", Font.BOLD, 28); button.setfont(f); frame.getcontentpane().add(borderlayout.north, button); frame.setsize(200, 200); frame.setvisible(true); public static void main(string[] args) { Button1 gui = new Button1(); gui.go();
BorderLayout 4º Exemplo import java.awt.borderlayout;import javax.swing.*; public class Button1 { public void go(){ JFrame frame = new JFrame(); JButton east = new JButton("Eeast"); JButton west = new JButton("West"); JButton north = new JButton("North"); JButton south = new JButton("South"); JButton center = new JButton("Center"); frame.getcontentpane().add(borderlayout.east, east); frame.getcontentpane().add(borderlayout.west, west); frame.getcontentpane().add(borderlayout.north, north); frame.getcontentpane().add(borderlayout.south, south); frame.getcontentpane().add(borderlayout.center, center); frame.setsize(300, 300); frame.setvisible(true); public static void main(string[] args) { Button1 gui = new Button1(); gui.go();
BorderLayout 5º Exemplo import java.awt.*; import javax.swing.*; public class SimpleGui4 implements ActionListener{ JFrame frame; public void go() { frame = new JFrame(); frame.setdefaultcloseoperation(jframe.exit_on_close); JButton button = new JButton("Mudar Cor"); button.addactionlistener(this);//espera evento //Cria panel para desenhar círculo ExPanel4 ep4 = new ExPanel4(); //Adiciona botão na região SOUTH do frame frame.getcontentpane().add(borderlayout.south, button); //Adiciona panel na região central frame.getcontentpane().add(borderlayout.center, ep4); //... frame.setsize(300, 300); frame.setvisible(true);
BorderLayout 5º Exemplo //... Continuação da classe SimpleGui4 public void actionperformed(actionevent e) { //Toda vida que o botão for clicado, a tela vai redesenhar frame.repaint(); public static void main(string[] args) { SimpleGui4 gui = new SimpleGui4(); gui.go();
BorderLayout Resultado 5º Ex.
FlowLayout 1º Exemplo import java.awt.*;import javax.swing.*; public class Button2 { public void go(){ JFrame frame = new JFrame(); frame.setlayout(new FlowLayout()); JButton button1 = new JButton("Botão 1"); JButton button2 = new JButton("Botão 2"); JButton button3 = new JButton("Botão 3"); frame.getcontentpane().add(button1); frame.getcontentpane().add(button2); frame.getcontentpane().add(button3); frame.setsize(200, 200); frame.setvisible(true); public static void main(string[] args) { Panel1 gui = new Panel1(); gui.go();
FlowLayout 2º Exemplo import java.awt.*;import javax.swing.*; public class Panel1 { public void go(){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); //Define cor do fundo do panel panel.setbackground(color.cyan); //Cria botões e adiciona ao panel JButton button1 = new JButton("Botão 1"); JButton button2 = new JButton("Botão 2"); panel.add(button1); panel.add(button2); frame.getcontentpane().add(borderlayout.east, panel); frame.setsize(250, 200); frame.setvisible(true); public static void main(string[] args) { Panel1 gui = new Panel1(); gui.go();
BoxLayout 1º Exemplo import java.awt.*;import javax.swing.*; public class Panel2 { public void go(){ JFrame frame = new JFrame(); JPanel panel = new JPanel(); panel.setbackground(color.cyan); panel.setlayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); JButton button1 = new JButton("Botão 1"); JButton button2 = new JButton("Botão 2"); panel.add(button1); panel.add(button2); frame.getcontentpane().add(borderlayout.east, panel); frame.setsize(250, 200); frame.setvisible(true); public static void main(string[] args) { Panel2 gui = new Panel2(); gui.go();
GridLayout 1º Exemplo import java.awt.*;import javax.swing.*; public class Panel3 { public void go(){ JFrame frame = new JFrame(); frame.setlayout(new GridLayout(2, 3)); JButton button1 = new JButton("Botão 1"); JButton button2 = new JButton("Botão 2"); JButton button3 = new JButton("Botão 3"); JButton button4 = new JButton("Botão 4"); JButton button5 = new JButton("Botão 5"); JButton button6 = new JButton("Botão 6"); frame.getcontentpane().add(button1); frame.getcontentpane().add(button2); frame.getcontentpane().add(button3); frame.getcontentpane().add(button4); frame.getcontentpane().add(button5); frame.getcontentpane().add(button6); frame.setsize(300, 150); frame.setvisible(true);
BorderLayout 6º Exemplo Deseja-se 4 componentes:
BorderLayout 6º Exemplo 1ª Opção: Implementar dois método actionperformed() class MyGui implements ActionListener{... public void actionperformed(actionevent e){ frame.repaint(); public void actionperformed(actionevent e){ label.settext( Novo Texto ); Não permitido implementar o mesmo método duas vezes em Java!!
BorderLayout 6º Exemplo 2ª Opção: Mesmo método actionperformed() para dois botões class MyGui implements ActionListener{ //...Declara variáveis public void go(){ //... Constrói a GUI colorbutton = new JButton(); labelbutton = new JButton(); //Registra ambos botões colorbutton.addactionlistener(this); labelbutton.addactionlistener(this); //... Demais códigos public void actionperformed(actionevent e){ if (e.getsource() == colorbutton) frame.repaint(); else label.settext( Novo Texto );
BorderLayout 6º Exemplo 3ª Opção: Criar duas classes ActionListener separadas class MyGui { JFrame frame; JLavel label; public void go(){ //... Constrói a GUI //Fecha classe MyGui class ColorButtonListener implements ActionListener{ public void actionperformed(actionevent e){ frame.repaint(); //Fecha classe ColorButtonListener Classe ColorButtonListener não sabe quem é frame nem a classe LabelButtonListener sabe quem é label class LabelButtonListener implements ActionListener{ public void actionperformed(actionevent e){ label.settext( Muda Texto ); //Fecha classe LabelButtonListener
BorderLayout 6º Exemplo Solução: INNER CLASS Classes Internas: Classe dentro de outra classe; Classe interna pode usar todos os métodos e variáveis da classe mais externa; Instância da classe interna apenas dentro da classe externa. class MyClass{ private int x; class MyInnserClass{ void go(){ x = 30;
BorderLayout 6º Exemplo Solução: INNER CLASS Exemplo de instância da inner class: class MyClass{ private int x; MyInnerClass inner = new MyInnerClass(); public void do(){ inner.go(); class MyInnerClass{ void go(){ x = 30;
BorderLayout Solução 6º Ex. import java.awt.borderlayout; import java.awt.event.*; import javax.swing.*; public class TwoButtons { JFrame frame; JLabel label; public void go(){ frame = new JFrame(); frame.setdefaultcloseoperation(jframe.exit_on_close); JButton labelbuton = new JButton("Mudar Label"); labelbuton.addactionlistener(new LabelListener()); //LabelListener:innerClass JButton colorbutton = new JButton("Mudar Círculo"); colorbutton.addactionlistener(new ColorListener()); //ColorLisntener:innerClass label = new JLabel("Eu sou um Label"); ExPanel4 ep4 = new ExPanel4(); //... frame.getcontentpane().add(borderlayout.south, colorbutton); frame.getcontentpane().add(borderlayout.center, ep4); frame.getcontentpane().add(borderlayout.east, labelbuton); frame.getcontentpane().add(borderlayout.west, label); frame.setsize(500, 300); frame.setvisible(true);
BorderLayout Solução 6º Ex. //... Continuação classe TwoButtons //Classe interna que trata mudança de texto do label class LabelListener implements ActionListener{ public void actionperformed(actionevent e) { label.settext("texto Alterado"); //Fecha classe LabelListener //Classe interna que trata mudança do círculo class ColorListener implements ActionListener{ public void actionperformed(actionevent e) { frame.repaint(); //Fecha classe ColorListener //Método principal public static void main(string[] args) { TwoButtons gui = new TwoButtons(); gui.go(); //Fecha classe TwoButtons
JComponent Método getname( ) setname(string n) getparent( ) isvisible( ) setvisible( boolean b) isshowing( ) isenabled( ) Descrição Retorna o nome do componente Atribui um nome ao componente Retorna o Container onde o componente foi adicionado Determina se o componente é visível. Componentes são inicialmente visíveis, exceto Frame, Window e Dialog. Torna o componente visível ou não, de acordo com o parâmetro. Retorna true se o componente for visível e estiver dentro de um outro componente que está sendo mostrado. Determina se um componente está habilitado para receber a entrada do usuário e gerar eventos. Componentes são inicialmente habilitados.
JComponent Método setenabled(boolean b) settooltiptext(string text) setpreferredsize(dimension d) getpreferredsize() Descrição Habilita ou desabilita o componente. Registra o texto para ser mostrado em tooltip Atribui o tamanho desejado Retorna o tamanho do componente.
Container Método add(component c) add(component c, int i) getalingnmentx() getalingnmenty() removeall( ) setlayout(layoutmanager l) Descrição Adiciona um componente ao container. Adiciona um componente ao container na posição indicada pelo segundo parâmetro. Retorna um inteiro correspondente ao alinhamento no eixo x. Retorna um inteiro correspondente ao alinhamento no eixo y. Remove todos os componentes inseridos. Reorganiza o container e todos os seus componentes.
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Exemplos
Referências Material Didático. Gleydson Lima; Head First Java. Kathy Sierra & Bert Bates; Java Como Programar. Deitel; www.j2eebrasil.com.br www.google.com