Вы находитесь на странице: 1из 27

TRABALHO DE PROGRAMAO ORIENTADA OBJETO 2

Nome: Danillo Moreira dos Santos Nome: Marcia Cristina Nome: Thiago Sarmento Nome: Jose Felipe

INTRODUCAO
Tendo sido originalmente concebida para o desenvolvimento de pequenos aplicativos e programas de controle de aparelhos eletrodomsticos e eletroeletrnicos, Java mostrou-se ideal para ser usada na rede Internet. O que a torna to atraente o fato de programas escritos em Java poderem ser executados virtualmente em qualquer plataforma, mas principalmente em Windows, Unix e Mac. Em meio a essa pluralidade, Java um idioma comum, falado por todos. Isto significa que Java ideal para expressar idias em forma de programas universalmente aceitos. Soma-se a isso o fato de programas Java poderem ser embutidos em documentos HTML, podendo assim ser divulgados pela rede. Diferente da linguagem C, no apenas o cdigo fonte que pode ser compartilhado pela rede, mas o prprio cdigo executvel compilado, chamado bytecodes. Em contraste com a letargia de documentos tradicionais, Java acrescenta a interatividade entre o usurio e o documento que est sendo consultado, tornando-o mais expressivo, agradvel e surpreendente. Java ideal para a elaborao de material educacional, pois permite ilustrar claramente os conceitos enquanto possibilita um ensino individualizado. Java foi desenvolvida por um grupo de pesquisadores da SUN Microsystems por volta de 1990, pouco antes da exploso da Internet. Essa linguagem possui estrutura muito semelhante da linguagem C, da qual descende imediatamente. Java tem em comum com a linguagem C++ o fato de ser orientada a objetos e mantm com esta uma alto grau de semelhana. Esse paradigma de programao consiste de um grau a mais na abstrao da programao, em comparao com a programao estruturada, e tem se mostrado extremamente til na produo de programas cada vez mais sofisticados, em menor tempo e com maior qualidade. A programao orientada a objetos (OOP) hoje universalmente adotada como padro de mercado, e muitas linguagens tradicionais foram aperfeioadas para implementar esse paradigma, como C++, Object Pascal, etc. H uma certa curiosidade por detrs do nome dado a essa linguagem de programao. Java o nome de uma ilha do Pacfico, onde se produz uma certa variedade de caf homnimo. A inspirao bateu equipe de desenvolvimento ao saborear esse caf em uma lanchonete local. Deram-se conta de como era extremamente apreciado por profissionais da rea de software (ao menos nos Estados Unidos), de modo que no foi menos justo fazer-lhe homenagem ao batizar uma nova linguagem de programao. Atualmente, o site JavaSoft mantm informaes atualizadas sobre o desenvolvimento da linguagem Java e suas relaes com o mercado, assim como utilitrios e ferramentas disponveis para serem baixados gratuitamente.

Swing e AWT

Nas primeiras verses do Java a nica forma de fazer programas grficos era atravs da AWT, uma biblioteca de baixo-nvel que dependia de cdigo nativo da plataforma onde rodava. Ela traz alguns problemas de compatibilidade entre as plataformas, fazendo que nem sempre o programa tivesse a aparncia desejada em todos os sistemas operacionais, sendo tambm mais difcil de ser usada. Para suprir as necessidades cada vez mais freqentes de uma API mais estvel e fcil de usar, o Swing foi criado como uma extenso do Java a partir da verso 1.2. O Swing fornece componentes de mais alto nvel, possibilitando assim uma melhor compatibilidade entre os vrios sistemas onde Java roda. Ao contrrio da AWT, Swing no contm uma nica linha de cdigo nativo, e permite que as aplicaes tenham diferentes tipos de visuais, e interfaces. J com AWT isso no possvel, tendo todos os programas a aparncia da plataforma onde esto rodando. Apesar da AWT ainda estar disponvel no Java, altamente recomendvel que sejam usado Swing, pelas razes descritas aqui e por vrias outras. Componentes Swing contm um "J" na frente, como em JButton por exemplo. Componentes AWT no contm inicial alguma ( "Button" no caso ). Alm disso tudo, as vantagens do Swing no param por ai. H uma enorme gama de controles extras disponveis, tais como reas de texto que nativamente podem mostrar contedo RTF ou HTML, botes com suporte a imagens, sliders, selecionadores de cores etc. tambm possvel alterar o tipo de borda para a maior parte dos componentes, todos podem ter imagens associadas e possvel at ter controle de como so desenhados os mnimos detalhes de apresentao. Outra caracterstica importante o fato dos componentes swing serem subclasses do mesmo componente, Jcomponent, e isso facilita e muito a programao destes componentes. relativamente simples, resumidamente ,os componentes do tipo swing possuem uma grande diferena dos Componentes AWT, pois os componente Swing so implementados com nenhum cdigo nativo, ou seja, apesar de serem sensivelmente mais lentos que os Componentes nativos, eles permitem maior liberdade (Eu amo essa palavra) aos programadores.

Componentes Bsicos O seguinte esquema mostra a maioria das classes que compem o Java Swing e mostra tambm a relao entre as classes AWT (amarelo) e as classes Swing (azul):

Figura 1: Diagrama resumido das classes AWT (amarelo) e Swing (azul).

1. Introduo Concepo de Interfaces Grficas. notrio a todos ns que muitos dos programas que conhecemos interagem com os usurios atravs da troca de informaes. O meio pelo qual a parte humana solicita ao programa a execuo de tarefas, alguma resposta, ou qualquer comunicao entre as partes feita pela Interface. Muitas vezes confundida com o programa em s, a Interface tem peso significativo na aceitao do software, j que, com certeza, clientes so atrados pela facilidade de manipulao e de aprendizado, telas atraentes e chamativas, bem como pelos componentes auto-explicativos. Essas caractersticas mencionadas so obtidas aliando-se criatividade, bom senso, organizao lgica, conhecimento tcnico, etc.. A interface grfica com o usurio (GUI - graphical user interface) fornece a um programa um conjunto consistente de componentes intuitivos, familiarizando o usurio com as diversas funes e diminuindo o tempo de aprendizado da nova ferramenta [1]. As GUIs so construdas a partir de componentes GUI, que so objetos com o qual o usurio interage atravs dos dispostivos de entrada, ou seja, o mouse, o teclado, a voz, etc. 2. Criao de Interfaces Grficas. Em Java, as classes nas quais nos baseamos para criar os componentes, bem como para fornecer-lhes funcionalidade, esto agrupadas em dois grandes pacotes: java.awt (pacote do ncleo) e javax.swing (pacote de extenso). Os dois pacotes definem componentes com peculiaridades distintas e que sero discutidas logo abaixo. 2.1 Componentes Swing. O pacote javax.swing foi criado em 1997 e inclui os componentes GUI que se tornaram padro em Java a partir da verso 1.2 da plataforma Java A maioria dos componentes Swing (assim so denominados) so escritos, manipulados e exibidos completamente em Java, sendo conhecidos como componentes Java puros. Isso oferece a eles um maior nvel de portabilidade e flexibilidade. Os nomes de tais componentes recebem um J, como,por exemplo: JLabel, JButton, JFrame, JPanel, etc. Tal peculiaridade se justifica para diferenciar esses componentes dos que sero mencionados logo adiante. So considerados peso-leve e fornecem funcionalidade e aparncia uniforme em todas as plataforma, sendo denominada de aparncia de metal (metal look-and-feel).

Figura 2.1: Aparncia de metal (comum em todas as plataformas). Entretanto, muitos componentes Swing ainda so considerados peso-pesado.Em particular, as subclasses de java.awt.Window, como JFrame, utilizada para exibir janelas e as de

java.applet.Applet, como JApplet originam componentes que se apiam no sistema de janelas da plataforma local para determinar sua funcionalidade, aparncia e seu comportamento[1].

Figura 2.2: Aparencia personalizada com o estilo do Motif. O Swing tambm fornece flexibilidade para personalizar a aparncia e o comportamento dos componentes de acordo com o modo particular de cada plataforma, ou mesmo alter-los enquanto o programa est sendo executado. As opes so a personalizao com o estilo do Microsoft Windows, do Apple Macintosh ou do Motif (UNIX). 2.2 Componentes A.W.T. Os componentes GUI oriundos do pacote Abstract Windowing Toolkit (java.awt) tiveram origem na verso 1.0 da plataforma Java 2, e esto diretamente associados com os recursos da interface grfica da plataforma do usurio. Dessa forma, a aparncia dos componentes difere quando o programa executado no Microsoft Windows e no Apple Macintosh. Podemos dizer que estes componentes considerados peso-pesados herdam a aparncia definida pela plataforma, pois o A.W.T. foi projetado para que cada maquina virtual Java implemente seu elemento de interface. Isso pode ser desejvel, uma vez que permite aos usurios do programa utilizar os componentes GUI com que eles j esto familiarizados, porem o leiaute e o alinhamento dos componentes pode se alterar devido aos tamanhos diferentes dos mesmos em cada plataforma [1]. Se voc executar o exemplo implementado pelo cdigo precedente, vera que a aparncia dos componentes muda, porem a janela, que e um objeto da classe JFrame (considerado componente peso-pesado), permanece inaltervel. Tambm e possvel notar isso comparando as figuras 2.1 e 2.2. Essa coleo de componentes para construo de Interfaces Grficas est desatualizada e foi substituda pelo projeto Swing [6]. Em virtude disso, nossa nfase reside no estudo e uso do pacote em maior evidencia.

2.3 Hierarquia das Classes dos Componentes. Mostraremos abaixo a hierarquia de herana das classes que definem atributos e comportamentos que so comuns a maioria dos componentes Swing. Cada classe exibida com o seu pacote:

Cada classe exibida com o seu pacote: -------------------------| java.lang.Object | -------------------------| -------------------------| java.awt.Component | -------------------------| -------------------------| java.awt.Container | -------------------------| -------------------------| javax.swing.JComponent | -------------------------| -----------------------------------------------| | | | | | -------- ----------- ------- -------- --------- ---------|JLabel| |JComboBox| |JList| |JPanel| |JSlider| |JPopuMenu| ------------------------ -------- ---------

----------

As operaes comuns `a maioria dos componentes GUI, tanto Swing como AWT so definidas na classe Component. Isso inclui mtodos relativos posicionamento, personalizao, tamanho, visibilidade, pintura, registro de tratadores de eventos, ajuste e retorno de estado dos componentes. Em aplicativos com JFrames e em applets, anexamos os elementos ao painel de contedo, que um objeto da classe Container. Logo, a classe Container da suporte `a adio e posicionamento dos componentes ao painel de conteudo de um container. A classe JComponent, que define os atributos e comportamentos para suas subclasses, e a superclasse da maioria dos componentes Swing. Com exceo dos containers JFrame e JDialog, todos os demais componentes Swingcujo nome comece com J descendem da classe JComponent [2]. Agora mostraremos o cdigo que implementa a funcionalidade de mudana de aparencia dos componentes, sendo que esta, j foi descrita anteriormente: 1 // Mudando a aparncia da GUI 2 import java.awt.*; 3 import java.awt.event.*; 4 import javax.swing.*; 5 6 public class TesteLookAndFeel extends JFrame { 7 11 8 private String strings[] = { "Metal", "Motif", "Windows" }; 9 private UIManager.LookAndFeelInfo aparencia[]; 10 private JRadioButton radio[]; 11 private ButtonGroup grupo; 12 private JButton botao; 13 private JLabel rotulo; 14 private JComboBox comboBox;

15 private JTextField campo; 16 private JTextArea texto; 17 18 // configura a GUI 19 public TesteLookAndFeel() 20 { 21 super( "Testando a Aparncia e Comportamento" ); 22 23 Container container = getContentPane(); 24 25 // configura painel para a regi~ao NORTH de BorderLayout 26 JPanel painelNorte = new JPanel(); 27 painelNorte.setLayout( new GridLayout( 2, 2, 5, 5 )); 28 29 // configura o rotulo para o painel NORTH 30 rotulo = new JLabel( "Esta e a apar^encia Metal" ); 31 rotulo.setVerticalTextPosition(SwingConstants.CENTER); 32 container.add( rotulo ); 33 34 // configura o boto para o painel NORTH 35 boto = new JButton( "Eu sou um Boto" ); 36 painelNorte.add( botao ); 37 38 campo = new JTextField( "Qualquer texto" ); 39 painelNorte.add( campo ); 40 41 // configura caixa de combinao para o painel NORTH 42 comboBox = new JComboBox( strings ); 43 painelNorte.add( comboBox ); 44 45 // anexa o painelNorte regio NORTH do painel de contedo 46 container.add( painelNorte, BorderLayout.NORTH ); 47 48 // cria array para os botes de opo 49 radio = new JRadioButton[ 3 ]; 50 51 // configura painel para a regio SOUTH de BorderLayout 52 JPanel painelSul = new JPanel(); 53 painelSul.setLayout( new GridLayout( 1, 3 ) ); 54 55 // configura botes de opo para o painelSul 56 radio = new JRadioButton[ 3 ]; 57 radio[ 0 ] = new JRadioButton( "Metal" ); 58 radio[ 1 ] = new JRadioButton( "Motif" ); 59 radio[ 2 ] = new JRadioButton( "Windows" ); 60 61 grupo = new ButtonGroup(); //implementa excluso mutua 62 TratadorDeItens trat = new TratadorDeItens(); 63 64 for ( int count = 0; count < radio.length; count++ ) { 65 radio[ count ].addItemListener( trat ); 66 grupo.add( radio[ count ] ); 12 67 painelSul.add( radio[ count ] ); 68 } 69 70 // anexa o painelSul regio SOUTH do painel de contedo 71 container.add( painelSul, BorderLayout.SOUTH ); 72 73 // obtm informaes sobre a aparncia e 74 // comportamento instalado 75 aparencia = UIManager.getInstalledLookAndFeels(); 76

77 setSize( 400, 300 ); 78 setVisible( true ); 79 radio[ 0 ].setSelected( true ); 80 } 81 82 // usa UIManager para mudar a aparncia e comportamento da GUI 83 private void mudeTheLookAndFeel( int valor ) 84 { 85 // muda aparncia e comportamento 86 try { 87 UIManager.setLookAndFeel( 88 aparencia[ valor ].getClassName() ); 89 SwingUtilities.updateComponentTreeUI( this ); 90 } 91 // processa problemas com a mudana da aparncia e 92 // do comportamento 93 catch ( Exception exception ) { 94 exception.printStackTrace(); 95 } 96 } 97 98 // executa a aplicao 99 public static void main( String args[] ) 100 { 101 TesteLookAndFeel aplicacao = new TesteLookAndFeel(); 102 aplicacao.setDefaultCloseOperation( 103 JFrame.EXIT_ON_CLOSE ); 104 } 105 106 // classe interna privativa para tratar eventos dos botes de opo 107 private class TratadorDeItens implements ItemListener { 108 109 // processa a seleo de aparncia e comportamento 110 // feita pelo usurio 111 public void itemStateChanged( ItemEvent evento ) 112 { 113 for ( int count = 0; count < radio.length; count++ ) 114 { 115 if ( radio[ count ].isSelected() ) { 116 rotulo.setText( "Esta e a aparncia " + 117 strings[ count ] ); 118 comboBox.setSelectedIndex( count ); 119 mudeTheLookAndFeel( count ); 120 } 121 } 122 } 123 } 124 }

MTODO
Explicando os tipos de mtodos existentes na programao OO. Quando definimos um objeto num programa orientado a objetos, implementamos todo o comportamento desse objeto em um ou mais mtodos. Um mtodo em Java equivalente a uma funo, subrotina ou procedimento em outras linguagens de programao. No existe em Java o conceito de mtodos globais. Todos os mtodos devem sempre ser definidos dentro de uma classe. A sintaxe para construo de um mtodo a seguinte: [modificador] tipo_retorno identificador ([argumentos]) { //Corpo do mtodo } Modificadores de Acesso Java controla o acesso a atributos e mtodos atravs do uso dos modificadores de acesso. So eles : public : o menos restritivo de todos. Atributos e mtodos declarados como public em uma classe podem ser acessados pelos mtodos da prpria classe, por classes derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais sobre pacotes e classes derivadas posteriormente). protected : Atributos e mtodos definidos como protected so acessveis pelos mtodos da prpria classe e pelas classes derivadas. private : o mais restritivo. Atributos e mtodos declarados como private s podem ser acessados pelos mtodos da prpria classe. Quando nenhum modificador definido (acesso do tipo package), os atributos e mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e por qualquer outra classe dentro do mesmo pacote. importante destacar que esse controle no se aplica s variveis locais aos mtodos.

Nome de Mtodos O nome de um mtodo deve comear com uma letra (a-z/A-Z), um underscore (_), ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9. Conveno : Use verbos para nome de mtodos. Faa a primeira letra do nome minscula com cada letra inicial interna maiscula. Por exemplo : getUserName(), getMaxPrice(). Argumentos Um mtodo pode ter zero ou mais argumentos (ou parmetros). Caso no tenha argumentos, necessrio informar os parnteses vazios tanto na definio como na chamada do mtodo.

O nome do mtodo acrescido de seus parmetros denominado assinatura do

mtodo. Cada argumento deve ser declarado como define-se uma varivel, especificando o seu tipo e nome. Caso seja mais de um argumento, cada declarao deve estar separada por vrgula. public void setAge(int newAge) { age = newAge; } //exemplo a public void displayAge() { System.out.println(Age is : + age); } //exemplo b public void setUser(int newAge, String newName) { age = newAge; name = newName; } //exemplo c Retornando Valor a Partir de um Mtodo possvel associar um valor de retorno a um mtodo. Para isso, preciso definir, na frente do nome do mtodo, o tipo do valor a ser retornado. O tipo pode ser um primitivo ou ento uma classe ou interface. Caso o mtodo no retorne valor algum, obrigatria a utilizao do tipo void na assinatura do mtodo. Veja os exemplos abaixo: public int getAge () { return age; } public String getName () { return name; } O comando return utilizado para passar o valor requerido de volta para quem chamou o mtodo e obrigatrio quando o tipo de retorno no void. Ele deve receber um nico valor ou uma expresso que deve ser compatvel com o tipo de retorno especificado para o mtodo. Quando o comando encontrado, o mtodo termina sua execuo imediatamente, ignorando todas as instrues subsequentes. Um comando return sem valor de retorno retorna o tipo void, mas no obrigatria sua utilizao nestes casos.

Passando Parmetros para um Mtodo Passando um Primitivo : Quando um valor primitivo passado na chamada de um mtodo, uma cpia deste valor criada e atribuda para o argumento do mtodo responsvel por receb-la. Se o mtodo mudar este valor, apenas o valor do argumento local ao mtodo afetado. Quando o mtodo terminar sua execuo, o valor original da varivel utilizada para passar o valor primitivo na chamada do mtodo permanecer inalterado. public void incrementa (int num) { num++; System.out.println(num : + num); } // veja agora int num = 10; incrementa (num); //Imprimir 11 System.out.println(num : + num); //Imprimir 10 Passando a Referncia de um Objeto : Quando o tipo passado para o mtodo no for um primitivo mas sim um objeto, esse comportamento muda. Quando passamos um objeto, uma referncia ao objeto original passada ao invs de uma cpia do objeto. A referncia contm o endereo de memria onde est contido o objeto original e qualquer modificao feita pelo mtodo no argumento que recebeu esta referncia afetar tambm o objeto original. O Java mais purista em relao orientao a objetos que Delphi, portanto no existem funes perdidas, cada mtodo esta hierarquicamente ligado a uma classe, portanto voc sempre ir acessar um mtodo atravs: Classe.Mtodo() ou Objeto.Mtodo Para os mtodos estticos no necessrio instanciar um objeto para us-lo, j nos outros casos, a funcionalidade do mtodo s possvel aps instanciao, que a criao de um objeto a partir da sua classe. J utilizamos mtodos de classes pr-definidas como em: Integer.parseInt() String.charAt() String.length(), entre outros. Podemos criar nossos prprios mtodos e j temos feito isso nos exemplos, j que cdigo funcional em Java sempre esta dentro de mtodos. O mtodo main que recebe o argumento String[] args tem sido utilizado em todos os exemplos, porm podemos dividir, modularizar mais ainda, distribudo a lgica em outros mtodos. At aqui os exemplos tm sido pequenos, imagine algo maior, com vrias tarefas agregadas, cada um com seu escopo natural, neste contexto o uso de mtodos se faz quase imprescindvel. O uso de mtodos separa e organiza a lgica, alm disso, tratar problemas grandes, dividindo os mesmos em problemas menores uma tcnica bastante efetiva.

Um mtodo deve ser codificado dentro da classe a qual pertence, portanto estar entre as chaves da classe. Um mtodo em Java, tal como uma funo retorna um valor, mas alternativamente podemos dizer que ele retorna vazio (void), sendo, portanto somente um procedimento. Vejamos a sintaxe bsica para criao de um mtodo: <qualificadores> <tipo-de-retorno> <nome-do-mtodo> ([lista-de-parmetros]){ <bloco-de-comandos> } O primeiro detalhe relativo a <qualificadores> estes podem assumir vrias formas, iremos destacar mais a frente este tpico, mas neste momento voc deve conhecer: public static Permite criar um mtodo que pode ser executado por agentes externos, inclusive independente de instanciao. private static Como o nome sugere este mtodo s visvel dentro da prpria classe onde foi definido e poder ser executado diretamente sem necessidade de instanciao. Em ambos os casos omitindo-se a palavra, static, estaremos obrigando a instanciao de um objeto para ento utilizar o mtodo, um mtodo esttico mais oneroso para o sistema, porm sempre temos algum mtodo esttico que inicia o processo de execuo. Com estes dois qualificadores possvel atender a praticamente todos os casos. O <tipo-de-retorno> um valor ou objeto que retornado pelo mtodo aps o processamento interno do mtodo, como em uma funo matemtica, voc pode passar parmetros e ter um valor como resposta. Voc declara o <tipo-de-retorno> como um tipo de dados ou uma classe. O <nome-do-mtodo> segue o padro de nomenclatura adotado at agora, veja que voc poder executar o mtodo chamado-o pelo nome. Relembrando este nome dever ter letras minsculas, a no ser as iniciais das segundas componentes em diante. A [lista-de-parmetros] opcional, mas muito interessante para fazer a interface entre o exterior e a rotina que esta internalizada ao mtodo, ao seja, pela parametrizao que voc consegue criar mtodos genricos, que atendam a vrias situaes. As chaves serviro para agrupar o que faz parte do mtodo, em termos de codificao. Vejamos um exemplo, onde iremos definir um mtodo chamado terco, que calcula um tero do valor que foi passado como parmetro, veja que continuamos a definir main e por onde tudo se inicia. UmTerco.java public class UmTerco{ public static void main(String[] args){ double num; for (num=1; num<10; num++){ System.out.println ("Um tero de " + num + " " + terco(num)); } System.out.println ("*** FIM ***"); } // mtodo auxiliar terco (calcula um tero de um parametro double) private static double terco (double n){ return n/3;

} } Note que a declarao de parmetros segue a regra de declarao comum, que colocar o tipo primeiro, depois o nome do parmetro. Outro detalhe que como estamos dentro da classe que contm o mtodo no precisamos preceder o nome do mtodo com o nome da classe. No prximo exemplo iremos criar uma funo de recebe como parmetro uma frase e retorna esta frase espacejada, ou seja, iremos adicionar um espao em branco para cada caractere da frase. FraseSpace.java public class FraseSpace{ public static void main(String[] args){ System.out.println(espacejando ("java")); System.out.println(espacejando ("O mtodo uma boa prtica de programao")); } private static String espacejando (String f){ String aux=""; for (byte i=0;i<f.length();i++){ aux=aux+f.charAt(i)+ " "; } return aux; } } Note que o parmetro pode ser passado tambm como um literal (java), no precisa ser uma varivel, porque estamos usando passagem de parmetro por valor, ou seja, feita uma cpia do valor e colocada na varivel que representa o parmetro no caso f. Para finalizar temos um exemplo com dois mtodos, somatrio e produtrio, que recebem um vetor de inteiros e devolvem a somatria e o produtrio dos elementos respectivamente. CalcVetor.java public class CalcVetor{ public static void main(String[] args){ int[] vetor = new int[5]; vetor[0]=10; vetor[1]=5; vetor[2]=7; vetor[3]=8; vetor[4]=1; System.out.println("O somatrio " + somatorio(vetor)); System.out.println("O produtrio " + produtorio(vetor)); } private static int somatorio (int[] v){ int aux=0; // Elemento neutro do somatrio for (byte i=0;i<v.length;i++) aux+=v[i]; return aux; }

private static int produtorio (int[] v){ int aux=1; // Elemento neutro do produtrio for (byte i=0;i<v.length;i++) aux*=v[i]; return aux; } }

METODO (JFRAME) O JFrame a classe do Swing que representa uma janela. Nesse artigo, vamos entender como ele funciona. Muito do que for visto aqui, ser diretamente aplicvel aos JApplets, portanto, mesmo que seu ideal no futuro seja trabalhar somente nos navegadores, ser uma boa idia ler esse tpico. Do contrrio da maioria dos tutoriais sobre janelas, esse no se destina a mostrar como inserir botes ou caixas de texto. Veremos o processo de pintura do Swing um pouco mais fundo, j que desenhar uma janela uma das atividades mais importantes num jogo. Propriedades bsicas O JFrame uma classe do pacote javax.swing. O primeiro passo para criar um JFrame importar esse pacote. A criao de um JFrame trivial, e resume-se a:

1 2 3 4 5 6 7 8 9 10 O que esse cdigo faz? Basicamente, ele cria um objeto do tipo JFrame, com o ttulo Minha primeira janela e o torna visvel. Entretanto, executar esse cdigo por ser um pouco frustrante. Primeiro, porque por padro, a janela ser criada com altura e largura 0. Depois, porque ela tambm ser posicionada no canto superior esquerdo da tela. Finalmente, clicar no X no canto da janela ir torn-la oculta, mas no terminar o programa. Da forma como est, o programa nunca termina. Como alterar essas propriedades? O JFrame possui uma srie de atributos que podem ser modificados. Um deles j vimos no exemplo anterior, a propriedade visible, alterada atravs do mtodo setVisible(). Para alterar os tamanho, por exemplo, podemos usar o mtodo setSize(int width, int height). Ento, vamos alterar esse programa para que o nosso Frame tenha um tamanho, aparea no centro da tela e feche a aplicao, quando for o usurio clicar no x. Por questo de sntese, vou deixar aqui s o cdigo que vai dentro do main. O resto permanece igual: package br.com.pontov.frame; import javax.swing.JFrame; public class MeuPrimeiroFrame { public static void main(String[] args) { JFrame frame = new JFrame(Minha primeira janela); frame.setVisible(true); } }

1 JFrame frame = new JFrame("Minha primeira janela"); 2 frame.setSize(400, 300); 3 frame.setLocationRelativeTo(null); 4 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 5 frame.setVisible(true);

A maior parte dos mtodos auto-explicativa. O mtodo setLocationRelativeTo posiciona o JFrame em relao a outro componente qualquer. Ele bastante til se sua aplicao tem vrias janelas, o que no o caso dos jogos. Entretanto, caso nenhum componente seja passado para ele, o mtodo automaticamente centraliza o JFrame. Voc s deve tomar o cuidado para us-lo aps o comando setSize, uma vez que o cdigo de centralizao precisa conhecer o tamanho da janela. A lista completa de todos os mtodos e sua descrio pode ser encontrada no javadoc da classe JFrame. O que acontece debaixo dos panos O mtodo setVisible() mostra o JFrame, mas no bloqueia a aplicao naquele ponto. Ou seja, outros comandos, aps o setVisible() continuaro a ser executados. Um programador Java mais atento pode estar se perguntando, mas se isso ocorre, porque a aplicao no finalizou assim que o main terminou? O que acontece que assim que a primeira janela aberta, o Swing dispara uma thread, para as aes de pintura e ela que mantm o programa vivo. importante saber que essa a nica thread que realizar a pintura, em todo Swing. Cada comando de pintura enfileirado, e essa thread executar uma ao dessa fila por vez. Isso porque a Sun percebeu que arquiteturas thread-safe, que permitissem a atualizao e pintura em vrias threads simultneas, tornariam o framework muito complexo, o que dificultaria para um programador criar seus prprios componentes j que eles tambm teriam que ser thread-safe. E permitir a criao de componentes personalizados um importante fator de sucesso para qualquer arquitetura de janelas. O Swing conhece todas as janelas criados pela aplicao. Ele ento entrar em janela por janela, disparando o mtodo: public void paint(Graphics g) Esse mtodo tambm disparado automaticamente caso uma janela se torne invisvel e seja reexibida, total ou parcialmente. Isso pode ocorrer, por exemplo, se a janela for minimizada e restaurada, ou se algum aplicativo entrar na frente da janela momentaneamente, destruindo parte de seu contedo. Esse mtodo tambm ser invocado automaticamente caso o componente seja redimensionado. O mtodo tambm pode ser forosamente disparado, atravs do comando repaint(). Isso colocar uma mensagem na fila de mensagens do Swing. Existem dois erros comuns que os programadores novatos cometem, envolvendo o mtodo paint:

1. Desenham usando o objeto Graphics uma nica vez, por exemplo, na construo do
JFrame, e esperam que aquela pintura ir continuar l. Como vimos, isso no acontecer j que, se um trecho da janela for ocultado, quem ter que repinta-lo o mtodo paint, e ele s far isso se for programado para tal. 2. Fazem algum processamento pesado e pretendem mostrar mensagens em meio a esse processamento. Isso no funciona por que, como j vimos, o Swing possui uma nica thread de pintura, que pinta de acordo com uma fila de mensagens. Para entender melhor o item 2, vamos examinar passo-a-passo o que ocorre: A janela pintada; O swing processa a primeira ao da fila, que o processamento pesado do usurio; Logo no incio, o programador tenta mostrar um status dizendo Processando, aguarde. Isso ir alterar o estado da janela, o que pe uma ao de repaint na fila; O processamento ocorre. O programador altera o status para Pronto!, o que enfileira um novo repaint. O Swing processa o primeiro repaint, pintando Pronto! O Swing descarta o segundo repaint, j que nenhum objeto mudou nesse meio tempo. A soluo para o este problema, disparar o processamento pesado em outra thread e, nessa outra thread, enfileirar comandos de pintura no Swing. Realizamos esse enfileiramento atravs do comando EventQueue.ivokeLater(Runnable) ou EventQueue.invokeAndWait(Runnable). Na verdade, uma boa prtica s alterar estado de objetos Swing a partir de outras threads usando um desses comandos.

Reescrevendo nosso programa Vamos agora deixar nosso programa mais adequado com os conceitos aprendidos. Para isso, vamos criar uma classe filha de JFrame e nela colocaremos todas as configuraes de nossa janela. uma boa prtica no alterar a visibilidade do Frame em sua construo. Tipicamente, quem cria uma janela quem deve dizer quando ela se torna visvel, essa no uma deciso que cabe a janela em si. Ento, iremos fazer com que o main assuma essa tarefa. Como o main roda na thread principal e no na thread do Swing, ele dever fazer isso usando a EventQueue. O cdigo final, depois de pronto, fica assim:

1 2 3 4 5 6 7 8 9 public class MeuPrimeiroFrame extends JFrame { public MeuPrimeiroFrame() { super("Minha primeira janela"); setSize(400, 300); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) {

10 final MeuPrimeiroFrame mpf = new MeuPrimeiroFrame(); 11 EventQueue.invokeLater(new Runnable() { 12 @Override 13 public void run() { 14 mpf.setVisible(true); 15 } 16 }); 17 } 18 } 19 Usamos agora o super, para chamar o construtor da classe pai, JFrame, passando o ttulo. Ajustamos o tamanho, localizao e comando padro de fechamento da janela, j no construtor. Por fim, nosso main cria um objeto da nossa janela, e em seguida o torna visvel, usando para isso a EventQueue. Mas, qual a vantagem dessa abordagem? A vantagem que agora poderemos sobrescrever o mtodo paint(). E exatamente exatamente nesse ponto que iniciar o nosso tutorial de Java 2D. Observaes finais Em jogos, iremos sobrescrever o mtodo paint(). Entretanto, o Swing para aplicaes comerciais j facilitou muito a tarefa de fazer janelas. Na classe JFrame, voc encontrar o mtodo add, que permite a adicionar um novo componente no interior do JFrame. Por padro, o mtodo paint() do JFrame ir percorrer todos os seus componentes, e chamar seus respectivos mtodos paint. O mtodo paint da classe JComponent ento dispara 3 mtodos:

1. paintBorder(Graphics): Que pinta uma borda ao redor do componente; 2. paintComponent(Graphics): Em componentes, esse mtodo equivalente ao paint. Se
voc estiver escrevendo um componente, sobrescreva paintComponent() no lugar de paint().

3. paintChildren(Graphics): Pinta os componentes que forem colocados sobre o seu


componente. No caso de um painel, por exemplo, pintaria todos os botes, caixas de textos, etc., dentro desse painel. Vrios componentes j esto presentes na enorme biblioteca do Swing, e muitos programadores sequer usaro os mtodos de pintura diretamente na vida. Alguns deles so:

Painis (JPanel), botes (JButton, JCheckBox, JRadioButton), caixas de texto (JTextField, JTextArea, JFormattedTextField, JEditorPane), tabela (JTable), entre outros.

O Swing tambm possui trs tipos de janela: O JFrame, que vimos at agora, o JDialog e o JInternalFrame. O JDialog similar ao JFrame, mas representa uma caixa de dilogo. Por isso, ela pode ser tornada modal, ou seja, impedir que o usurio realize outras aes fora da janela, at que seja fechada. Outra diferena que o mtodo setVisible() de janelas modais bloqueante. O JInternalFrame uma janela desenhada dentro de outra, na verdade, dentro de um JDesktopPane. Ele no pode ser arrastado para fora do desktop pane que a possui. No entraremos em detalhes sobre como montar uma janela Swing padro ou sobre como criar componentes personalizados. Para isso, a sun j disponibiliza extensa documentao em seu site, como a do trail: Creating GUI with JFC/Swing. Em jogos, geralmente sobrescreveremos totalmente a pintura e criaremos mo todo cenrio e seus atores. Finalmente, vale relembrar que os conceitos de pintura vistos aqui tambm valem para o JApplet.

EVENTOS

INCREMENTANDO NOSSAS INTERFACES Vamos ver mais componentes que vo nos permitir uma maior funcionalidade. Depois, vamos melhorar a maneira como tratamos os eventos. Assim, seremos capazes de fazer melhores interfaces, que no fazem o usurio querer destruir o micro. NOSSAS TELAS E OS EVENTOS Sem eventos, nossas telas no fazem absolutamente nada - precisamos dar vida a elas, acrescentando a capacidade de lidar com eventos. Na programao orientada a eventos a ordem de execuo de um programa indeterminada. Os componentes da tela causam eventos quando interagem com o usurio ou com o SO. Estes eventos devem ser tratados, fazendo com que o programa responda e dirigindo a execuo atravs dos tratadores de eventos.

EVENTOS Cada vez que o usurio bate numa tecla, movimenta o mouse ou aperta um boto deste, um evento ocorre. A programao orientada a eventos (Event-driven programming) consiste em fazer programas cuja ordem de execuo seja determina pela ocorrncia destes eventos.

Todo objeto pode ser notificado por um evento. Basta implementar a interface apropriada e ento registrar estes mtodos como um event listener do evento apropriado.

PROGRAMAO ORIENTADA A EVENTOS Na programao orientada a eventos, ns precisamos de um loop eterno que fica eternamente esperando por uma entrada do usurio. Isto feito no Java sem nosso conhecimento. S pelo fato de uma GUI estar ativa, este pseudo-loop est rodando. Quando um evento ocorre, o gerenciador de janelas (window manager) cria um evento e passa para um tratador de eventos definido pelo programador. Este processo chamado de callback. No final das contas, nosso trabalho definir os tratadores de eventos... EVENTOS Os componentes Swing podem gerar vrios tipos de eventos diferentes. Alguns exemplos: Usurio clica em um boto ActionListener Usurio fecha um frame WindowListener Usurio pressiona um boto do mouse MouseListener Usurio move o mouse MouseMotionListener Componentes se tornam visveis ComponentListener ENTENDENDO EVENTOS Cada evento representado por um objeto que contm informaes sobre este evento. Event source: quem gera o evento, normalmente um componente da GUI Event listener: Responde ao evento. Pode ser qualquer classe Java que implemente a interface correta. Uma nica fonte pode ter mltiplos listeners. mltiplassources. Um nico listener pode responder a

BSICO DO TRATAMENTO DE EVENTOS EM JAVA Escreva uma classe que implemente a interface associada ao evento a ser Normalmente, esta interface tem o nome do formato SomethingListener.

tratada.

Exemplo: tratadores de eventos de janelas so, e os de mouse, WindowListener, MouseListener

HIERARQUIA DE EVENTOS EM JAVA java.lang.Object +--java.util.EventObject +--java.awt.AWTEvent +--java.awt.event.ActionEvent +--java.awt.event.TextEvent +--java.awt.event.ComponentEvent +--java.awt.event.FocusEvent +--java.awt.event.WindowEvent

+--java.awt.event.InputEvent +--java.awt.event.KeyEvent +--java.awt.event.MouseEvent Precisamos colocar no nosso cabealho a statement import java.awt.event.*;

ACTIONEVENTS Tipo de evento mais simples e comum no Swing. Representa um ao qualquer ocorrendo em um componente da GUI Criado por: cliques em boto mudanas em checkboxes cliques de menu digitar [Enter] em uma textbox etc.

BSICO PARA OUVIR EVENTOS Para fazermos um tratador de eventos precisamos de trs aes bsicas. 1- Especificar uma classe que implemente uma interface de listener: public class MyClass implements ActionListener { 2 public ...//code Cdigo que void that implemente mtodos dentro actionPerformed(ActionEvent responds to the da interface e) event... listener { }

3 - Executar um cdigo que registre uma instncia desta classes como um listener de um ou mais componentes someComponent.addActionListener(instanceOfMyClass)

ESCREVENDO UM ACTIONLISTENER Precisamos implementar a interface ActionListener, que especifica o mtodo actionPerformed que deve ser implementado em nossa classe. No interessa se sua classe extender alguma outra classe. O cdigo bsico o seguinte: // Prints a message when the button is clicked. public class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println(Event occurred!); } } ESCREVENDO UM ACTIONLISTENER Agora precisamos associar nosso ActionListener ao elemento grfico cujo evento de ao ns trataremos. JButton button = new JButton(button 1);

MyActionListener listener = new MyActionListener(); button.addActionListener(listener); Agora, quando o boto button for clicado, veremos a mensagem Event occurred! impressa. O mtodo addActionListener existe em vrios componentes (basicamente todos aqueles que podem ter um evento de ao associado).

ONDE COLOCAR UM ACTION LISTENER Podemos colocar em uma classe interna: public class Outer { private class Inner implements ActionListener { public void actionPerformed(ActionEvent event) { ... } } public Outer() { JButton myButton = new JButton(); myButton.addActionListener(new Inner()); } } EXEMPLO public class GUIDemo extends JFrame implements ActionListener{ protected int numCl=0; protected JButton meuJButton = null; protected JLabel meuJLabel = null; public GUIDemo(String title) { super(title); initialize(); } public GUIDemo() {this("Demonstrando eventos");} EXEMPLO (CONT.) protected void initialize() { this.setSize( new Dimension(200,75) ); meuJButton = new JButton("Clique em mim!"); meuJButton.addActionListener(this); meuJLabel = new JLabel("Num. clicks="+numCl); this.getContentPane().add(meuJButton, BorderLayout.NORTH); this.getContentPane().add(meuJLabel, BorderLayout.SOUTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLO SE); this.pack(); this.setVisible(true); } EXEMPLO (CONT.)

public void actionPerformed(ActionEvent e) { numCl++; meuJLabel.setText("Num Clicks:"+numCl); }

EVENTOS DE MOUSE Motivao: Capturar os clicks e os movimentos do mouse dentro de um componente de uma GUI. Responder a atividade de mouse com aes apropriadas. Criar programas interativos que so dirigidos pela atividade do mouse. A INTERFACE MOUSELISTENER

package java.awt.event; public interface MouseListener { public void mouseClicked(MouseEvent event); public void mouseEntered(MouseEvent event); public void mouseExited(MouseEvent event); public void mousePressed(MouseEvent event); public void mouseReleased(MouseEvent event); } public class ML implements MouseListener { public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) { System.out.println(Pressionou!); } public void mouseReleased(MouseEvent e) {} } USANDO MOUSELISTENER //Dado um panel qualquer MyPanel panel = new MyPanel(); panel.addMouseListener(new MyMouseListener()); Problemas: Temos que implementar toda a interface. Isto tedioso, especialmente se s queremos usar um nico mtodo, como no exemplo.

MOUSEADAPTER uma classe com implementaes vazias de todos os mtodos da interface MouseListener. Para usar, extenda a classe MouseAdapter e sobreescreva os mtodos que lhe interessam. Evita a necessidade de implementar um monte de mtodos vazios que no nos interessam. Exemplo: public class MyMouseAdapter extends MouseAdapter { public void mousePressed(MouseEvent event) { System.out.println(User pressed mouse button!); } } // usando a classe que definimos (MyMouseAdapter) MyPanel panel = new MyPanel(); panel.addMouseListener(new MyMouseAdapter()); OBJETOS MOUSEEVENT Repare que todos os mtodos de MouseAdapter recebem um parmetro da classe MouseEvent. Esta uma classe pr-definida para que possamos saber de onde o evento que diparou o mtodo foi proveniente e certas circunstncias modificadoras associadas a ele. Constantes em InputEvent (me de MouseEvent) public static int BUTTON1_MASK,BUTTON2_MASK, BUTTON3_MASK,CTRL_MASK, ALT_MASK, SHIFT_MASK USANDO O MOUSEEVENT Mtodos interessantes em MouseEvent public int getClickCount() public Point getPoint() public int getX(), getY() public Object getSource() public int getModifiers() Exemplo de uso: public class MyMouseAdapter extends MouseAdapter { public void mousePressed(MouseEvent event) { Point p = event.getPoint(); Object source = event.getSource(); if (source == myPanel && p.getX() < 10) JOptionPane.showMessageDialog(null, Lado esquerdo!); } }

CAPTURANDO MOVIMENTO DO MOUSE: MOUSEMOTIONLISTENER package java.awt.event; public interface MouseMotionListener { public void mouseDragged(MouseEvent event); public void mouseMoved(MouseEvent event); } A classe abstrata MouseMotionAdapter prov uma implementao vazia de ambos os mtodos para que possamos sobreescrev-los. A idia a mesma da classe MouseAdapter com a interface MouseListener.

EXEMPLO MOUSEMOTIONADAPTER public class MyAdapter extends MouseMotionAdapter { public void mouseMoved(MouseEvent event) { Point p = event.getPoint(); int x = event.getX(); int y = event.getY(); System.out.println(Mouse is at + p); System.out.println(x is + x); System.out.println(y is + y); } } // usando o mtodo myPanel.addMouseMotionListener(new MyAdapter());

MOUSEINPUTLISTENER A interface MouseInputListener extende tanto a interface MouseListener quanto a interface MouseMotionListener Cdigo: package javax.swing.event; public interface MouseInputListener extends MouseListener, MouseMotionListener {} Logo, se voc quiser usar as duas, voc pode implementar apenas MouseInputListener. Assim como nos casos anteriores, existe uma classe Adapter que implementa verses vazias de todos os mtodos desta interface. Neste caso a classe a ser extendida MouseInputAdapter.

EXEMPLO DE MOUSEINPUTADAPTER public class MyMouseInputAdapter extends MouseInputAdapter { public void mousePressed(MouseEvent event) { System.out.println(Mouse was pressed); } public void mouseMoved(MouseEvent event) { Point p = event.getPoint(); System.out.println(Mouse is at + p); } } // using the listener MyMouseInputAdapter adapter = new MyMouseInputAdapter(); myPanel.addMouseListener(adapter); myPanel.addMouseMotionListener(adapter);

EVENTOS DE TECLADO So usados para ouvir atividade de teclado dentro de um componente UI (geralmente um panel). Com eles respondemos a atividade de teclado com as aes apropriadas.

A INTERFACE KEYLISTENER A interface KeyListener deve ser implementada para ouvirmos entradas do teclado. Cdigo: package java.awt.event; public interface KeyListener { public void keyPressed(KeyEvent event); public void keyReleased(KeyEvent event); public void keyTyped(KeyEvent event); }

Assim como nos casos anteriores, existe uma classe Adapter que implementa verses vazias de todos os mtodos desta interface. Neste caso a classe a ser extendida KeyAdapter.

A CLASSE KEYEVENT Objetos da classe KeyEvent so enviados para nossos tratadores de eventos de teclado. InputEvent public static int CTRL_MASK, ALT_MASK, SHIFT_MASK KeyEvent (descendente da InputEvent) public static int VK_A .. VK_Z, VK_0 .. VK_9, VK_F1 .. VK_F10,VK_UP, VK_LEFT, ..,VK_TAB, VK_SPACE,VK_ENTER,... (um para cada tecla) public char getKeyChar() public int getKeyCode() public Object getSource() public int getModifiers() (use as mscaras definidas em InputEvent) EXEMPLO DE KEYADAPTER class PacManKeyListener extends KeyAdapter { public void keyPressed(KeyEvent event) { char keyChar = event.getKeyChar(); int keyCode = event.getKeyCode(); if (keyCode == KeyEvent.VK_RIGHT) { pacman.setX(pacman.getX() + 1); pacpanel.repaint(); } else if (keyChar == 'Q') System.exit(0); } } PacPanel panel = new PacPanel(); panel.addKeyListener(new PacKeyListener());

EVENTOS DE JANELAS Os eventos de janela so tratados por classes que implementem a interface WindowListener. Definio: public interface WindowListener { public void windowClosing(WindowEvent e) public void windowClosed(WindowEvent e) public void windowOpened(WindowEvent e) public void windowIconified(Window Event e) public void windowDeIconified(Window Event e) public void windowActivated(Window Event e) public void windowDeactivated(Window Event e) }

Como seria de se esperar, existe uma classe chamada WindowAdapter que tem uma implementao vazia de cada um destes mtodos.

Bibliografia :

Вам также может понравиться