Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 184 3.12 COMPONENTES GUI E O TRATAMENTO DE EVENTOS Origem: Capítul 11 Cmpnentes GUI: Parte 1. Livr: Java Cm Prgramar, Deitel & Deitel, 6ª. Ediçã; Capítul 14 Cmpnentes GUI: Parte 1. Livr: Java Cm Prgramar, Deitel & Deitel, 8ª. Ediçã; Apêndice C Swing básic. Apstila FJ-11 (Java e Orientaçã a Objets versã anterir a an de 2012) 3.12.1 INTERFACES GRÁFICAS EM JAVA Uma Interface Gráfica cm Usuári (Graphical User Interface GUI): Apresenta um mecanism amigável a usuári para interagir cm uma aplicaçã; Dá a aplicativ uma aparência e um cmprtament distints; Send cnsistente permite que usuári se familiarize mais rapidamente cm ela, e prtant, pssa utilizá-la mais prdutivamente; Frequentemente cntém barra de títul, barra de menus, btões e caixas de cmbinaçã; É cnstruída a partir de cmpnentes GUI. Também cstumam ser denminads de cntrles u widgets (windw gadgets); Um cmpnente GUI é um bjet cm qual usuári interage via muse, teclad u utr dispsitiv de entrada. Figura 14.1 (Deitel, Java Cm prgramar) Janela cm alguns ds seus cmpnentes GUI habituais. Dica: Acessar e executar aplicativ SwingSet3 (dispnível na Web, http://dwnlad.java.net/javadesktp/swingset3/), um dem da API Swing, dispnibilizad cm um Java Web Start.
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 185 Atualmente, Java suprta, ficialmente, dis tips de biblitecas gráficas: AWT e Swing. A AWT fi a primeira API para interfaces gráficas a surgir n Java e fi, mais tarde, superada pel Swing (a partir d Java 1.2), que pssui diverss benefícis em relaçã a seu antecessr. As biblitecas gráficas sã bastante simples n que diz respeit a cnceits necessáris para usálas. A cmplexidade n aprendizad de interfaces gráficas em Java reside n tamanh das biblitecas e n enrme mund de pssibilidades; iss pde assustar, num primeir mment. AWT e Swing sã biblitecas gráficas ficiais inclusas em qualquer JRE u JDK. Além destas, existem algumas utras biblitecas de terceirs, send a mais famsa, SWT - desenvlvida pela IBM e utilizada n Eclipse e em váris utrs prduts. 3.12.2 PORTABILIDADE As APIs de interface gráfica d Java favrecem, a máxim, lema de prtabilidade da platafrma Java. O lk-and-feel d Swing é únic em tdas as platafrmas nde rda, seja ela Windws, Linux, u qualquer utra. Iss implica que a aplicaçã terá exatamente a mesma interface (cres, tamanhs, etc) em qualquer sistema peracinal. Grande parte da cmplexidade das classes e métds da Swing está n fat da API ter sid desenvlvida tend em mente máxim de prtabilidade pssível. Favrece-se, pr exempl, psicinament relativ de cmpnentes, em detriment d us de psicinament fix, que pderia prejudicar usuáris cm resluções de tela diferentes da prevista. Cm Swing, nã imprta qual sistema peracinal, qual resluçã de tela, u qual prfundidade de cres: sua aplicaçã se cmprtará da mesma frma em tds s ambientes. A bibliteca d Swing está n pacte javax.swing (inteira, excet a parte de acessibilidade, que está em javax.accessibility). 3.12.3 ENTRADA / SAÍDA BASEADA EM GUI SIMPLES COM JOPTIONPANE Um primeir exempl cm Swing utilizada para interagir cm usuári pde ser a exibiçã de uma janela de mensagem (caixa de diálg) cntend algum text. Utiliza-se para iss a classe JOptinPane (pacte javax.swing), que pssui um métd estátic chamad shwmessagedialg(). Tal classe e alguns de seus métds já fram anterirmente estudads. imprt javax.swing.joptinpane; public class OlaSwing { public static vid main(string[] args) { JOptinPane.shwMessageDialg(null, "Ola Swing!"); Iss exibirá a seguinte tela:
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 186 O primeir argument recebid pel métd shwmessagedialg() indica qual é cmpnente pai (n exempl, null, prque nã há mais cmpnentes); segund indica a mensagem a ser exibida. Há utr métd sbrecarregad nde se pde cnfigurar títul da janela e tip de mensagem ( ícne a ser exibid). Na classe JOptinPane, há ainda utrs métds para exibir janelas de cnfirmaçã (Ok/Cancelar) métd shwcnfirmdialg()e janelas para entrada de dads pel usuári (input) shwinputdialg()(sbrecarregada cm 2 u 4 parâmetrs, e retrn String). Um utr exempl simples pde ser encntrad na classe Additin (livr Java-Cm prgramar, capítul 14, Figura 14.2, códig-fnte em anex). Tal exempl realiza a sma de dis númers infrmads pel usuári, exibind resultad em uma caixa de diálg. 3.12.4 CRIANDO UM FORMULÁRIO SIMPLES A mairia das aplicações gráficas d mund têm, em algum mment, algum frmulári para entrada de dads. Vams criar, entã, um frmulári bem simples utilizand Swing. A API d Swing traz uma série de cmpnentes visuais prnts para us. Sã camps de text, btões, checkbxes, labels, tabelas, árvres e muits utrs. Para cmeçar frmulári exempl, utiliza-se dis cmpnentes: um camp de text (JTextField) para entrada d dad e uma etiqueta/label/rótul (JLabel) para tal camp: // O JLabel recebe text a ser exibid JLabel label = new JLabel("Seu nme:"); // O JTextField recebe cm argument tamanh d camp JTextField textfield = new JTextField(20); Td cmpnente Swing deve ser adicinad a um cntêiner (Cntainer) que administrará agrupament e exibiçã ds mesms. O cntainer mais cmum é JPanel (alg cm um painel de cmpnentes). Através de seu métd add(), é pssível adicinar s cmpnentes a este cntainer. // Cria um JPanel (cntainer) JPanel panel = new JPanel(); // adicina s cmpnentes panel.add(label); panel.add(textfield); Pr últim, para exibir frmulári, é precis clcar JPanel em uma janela. Pde-se usar a classe JFrame, que representa uma janela simples. // Criams um JFrame passand títul da janela JFrame frame = new JFrame("Meu primeir frmulári"); // Adicinams nss JPanel frame.add(panel); // Preparams JFrame para exibiçã frame.pack(); // Ajusta tamanh da janela frame.setvisible(true); // Trna a janela visível
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 187 O métd pack() de JFrame, chamad acima, serve para redimensinar frame para um tamanh adequad basead ns cmpnentes que ele tem. E métd setvisible() recebe um valr blean indicand se é desejad que a janela seja visível u nã. É interessante adicinar um últim cmand, que indica a frame que a aplicaçã deve ser terminada quand usuári fechar a janela. frame.setdefaultclseoperatin(jframe.exit_on_close); Outras pções pssíveis (também cnstantes de JFrame) sã: HIDE_ON_CLOSE, DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE. N exempl cmplet abaix, clcu-se tdas as variáveis cm atributs e criu-se um métd chamad mntarfrmulari() cm td códig explicad antes. N métd main(), criuse um nv Frmulari e disparu-se métd mntarfrmulari(). imprt javax.swing.*; //imprtu-se tdas as classes d pacte public class Frmulari { private JLabel label; private JTextField textfield; private JPanel panel; private JFrame frame; private vid mntarfrmulari() { label = new JLabel("Seu nme:"); textfield = new JTextField(20); panel = new JPanel(); panel.add(label); panel.add(textfield); frame = new JFrame("Meu primeir frmulári"); frame.add(panel); frame.pack(); frame.setvisible(true); frame.setdefaultclseoperatin(jframe.exit_on_close); public static vid main(string[] args) { new Frmulari().mntarFrmulari(); A rdar este prgrama, tem-se a seguinte tela para digitaçã d nme:
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 188 3.12.5 ADICIONANDO EVENTOS O frmulári anterir é até interessante para cmeçar a aprender Swing, mas ele é ttalmente inútil, nã faz nada. É necessári ser capaz de recuperar valr digitad pel usuári para efetuar alguma peraçã (salvar n banc de dads, exibir, enviar via rede, mandar um email, etc). Para se fazer efetivamente alguma cisa, trabalha-se cm events que sã disparads pel usuári. O Swing pssui uma frma muit elegante de trabalhar cm events - através de interfaces. O usuári pde disparar events a digitar, a clicar, a passar muse, e muitas utras situações. N frmulári exempl, será usad um btã (cmpnente) que, quand clicad pel usuári (event), disparará um métd (tratadr/handler). Neste métd, será recuperad text digitad pel usuári e será efetuada alguma açã. O cmpnente Swing que representa um btã é JButtn. É precis criar um btã e clcál n cntainer ( JPanel). // cria JButtn passand text d btã JButtn buttn = new JButtn("Exibir"); // adicina btã a JPanel panel.add(buttn); Iss acrescentará btã a frmulári. Mas cm disparar um métd quand btã fr clicad? O Swing traz cnceit de Listeners (uvintes), que sã interfaces que implementam métds para serem disparads pr events. N exempl apresentad, para fazer um métd disparar a clique d btã, utiliza-se a interface ActinListener. Essa interface cntém um métd actinperfrmed(), cuja assinatura é cm abaix. public vid actinperfrmed (ActinEvent e) { // implementaçã aqui... Pde-se fazer, entã, a própria classe Frmulari implementar essa interface e esse métd. Deseja-se que, quand btã fr clicad, capture-se text digitad pel usuári e exiba na tela (usand JOptinPane para iss). O métd actinperfrmed() ficaria cm n códig exempl abaix: public vid actinperfrmed (ActinEvent e) { // pega text d JTextField, através d métd aprpriad String text = textfield.gettext(); // exibe usand JOptinPane
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 189 // aqui usams frame cm cmpnente pai da messagedialg JOptinPane.shwMessageDialg(frame, text); O últim detalhe que falta, é indicar que essa açã (esse ActinListener) deve ser disparada quand btã fr clicad. Iss é feit através d métd addactinlistener(), chamad n btã. Ele recebe cm argument um bjet que implementa ActinListener (n exempl, própri Frmulari, this). buttn.addactinlistener(this); O códig final d frmulári deve estar assim: public class Frmulari implements ActinListener { private JLabel label; private JTextField textfield; private JButtn buttn; private JPanel panel; private JFrame frame; private vid mntarfrmulari() { label = new JLabel("Seu nme:"); textfield = new JTextField(20); buttn = new JButtn("Exibir"); buttn.addactinlistener(this); panel = new JPanel(); panel.add(label); panel.add(textfield); panel.add(buttn); frame = new JFrame("Meu primeir frmulári"); frame.add(panel); frame.pack(); frame.setvisible(true); frame.setdefaultclseoperatin(jframe.exit_on_close); public vid actinperfrmed (ActinEvent e) { String text = textfield.gettext(); JOptinPane.shwMessageDialg(frame, text); public static vid main (String[] args) { new Frmulari().mntarFrmulari();
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 190 A rdar esse prgrama, frmulári será exibid cm um label, um camp de text e um btã. Depis de digitar alg e clicar n btã, será visualizada uma mensagem cm text d camp preenchid. 3.12.6 GERENCIADORES DE LAYOUT Quand sã adicinads nvs cmpnentes, cm Java sabe nde psiciná-ls? Pr que sempre sã adicinads d lad direit? Se a tela fr redimensinada (teste) - reduzind seu tamanh - s elements fluem para a linha de baix. Pr quê? Essas e utras perguntas sã respndidas pel Layut Manager, gerenciadr de layut d Swing. O Java vem cm uma série de layuts diferentes, que determinam cm s elements serã dispsts na tela, seus tamanhs preferenciais, cm eles se cmprtarã quand a janela fr redimensinada e muits utrs aspects. A escrever uma aplicaçã Swing deve-se indicar qual Layut Manager deseja-se utilizar. Pr padrã, é utilizad FlwLayut que especifica justamente que s elements devem ser justapsts, que eles devem fluir um para baix d utr quand a tela fr redimensinada e etc. Pderia-se usar um utr Layut Manager cm GridLayut, pr exempl. A aplicaçã ficaria da seguinte frma: Ntar cm s elements parecem estar dispsts em uma grade (um grid). A redimensinar essa tela, pr exempl, s elements nã fluem cm antes; eles sã redimensinads para se adaptarem a nv tamanh d grid. Ou ainda, usand BxLayut pel eix y, tend seguinte aspect: Há uma série de Layut Managers dispníveis n Java, cada um cm seu cmprtament específic. Além ds citads, destaca-se também BrderLayut. Há inclusive Layut Managers de terceirs (nã-ficiais d Java) que pdem ser baixads; prjet JGdies, pr exempl, tem um excelente Layut Manager timizad para trabalhar cm frmuláris, FrmLayut. Para saber mais sbre Layut Managers, quais sã e cm usar cada um deles, cnsulte a dcumentaçã da Swing.
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 191 3.12.7 LOOK AND FEEL Lk-and-Feel (u LaF) é nme que se dá à cara da aplicaçã (suas cres, frmats e etc). Pr padrã, Java vem cm um lk-and-feel própri, que se cmprta exatamente da mesma frma em tdas as platafrmas suprtadas. Mas às vezes esse nã é resultad desejad. Quand rda-se a aplicaçã n Windws, pr exempl, é bastante gritante a diferença em relaçã a visual das aplicações nativas. Pr iss é pssível alterar qual lk-and-feel a ser usad na aplicaçã. Além d padrã d Java, JRE 5 da Sun ainda traz LaF nativs para Windws e Mac OS, além d Mtif e GTK. E, fra esses, ainda pdem ser baixads diverss LaF na Internet u até desenvlver s própris. Abaix estã alguns screenshts da dcumentaçã d Swing mstrand a mesma aplicaçã rdand cm 4 LaF diferentes: OBSERVAÇÕES: lk-and-feel atualmente em destaque: Nimbus, dispnível a partir d java 6 update 10; Para alterar lk-and-feel de um aplicativ é pssível usar métd estátic setlkandfeel() da classe javax.swing.uimanager. Tal métd requer um bjet LkAndFeel/ String cm nme da classe cm argument. Alguns exempls de bjets LkAndFeel: javax.swing.plaf.metal.metallkandfeel;
Cnteúd: Prgramaçã Orientada a Objets Linguagem JAVA Página: 192 javax.swing.plaf.synth.synthlkandfeel; Cnsultar javadc d Swing pde nã ser muit simples. Pr iss, a Sun dispnibiliza um ótim tutrial nline sbre Swing em seu Site: http://java.sun.cm/dcs/bks/tutrial/uiswing/ Existem alguns bns editres visuais (Drag-and-Drp) para se trabalhar cm Swing, entre prduts cmerciais e livres. Destaque para: Matisse, que vem embutid n Netbeans e é cnsiderad, hje, melhr editr; VEP (Visual Editr Plugin), um plugin que pde ser instalad n Eclipse; Aplicações grandes cm Swing pdem ganhar uma cmplexidade enrme e ficar difíceis de manter. Alguns prjets tentam minimizar esses prblemas; há, pr exempl, fams prjet Thinlet, nde vcê pde utilizar Swing escrevend suas interfaces gráficas em XML. 3.12.8 COMPLEMENTO OBRIGATÓRIO Capítul 14 Cmpnentes GUI: Parte 1. Livr Java Cm Prgramar, Deitel & Deitel, 8ª. Ediçã. Similar a Capítul 11 Cmpnentes GUI: Parte 1. Livr: Java Cm Prgramar, Deitel & Deitel, 6ª. Ediçã. 3.12.9 LEITURA RECOMENDADA Material indicad n iníci d tópic, cm rigem d text dispnibilizad; Fóruns na Internet. 3.12.10 EXERCÍCIOS Execuçã d Trabalh específic.