Sei sulla pagina 1di 10

3

Nesta aula iremos utilizar dois componentes do Swing: JTabbedPane1 e JTable2. Iremos desenvolver duas aplicaes bsicas mas que vos permitiro no futuro desenvolver aplicaes mais complexas. Uma chamada de ateno para os alunos menos dedicados. Estes exemplos no so exactamente um tutorial step-by-step. Os procedimentos, que foram utilizados em exemplos anteriores no sero repetidos novamente. S ser indicada a sua utilizao! Em primeiro lugar iremos construir uma mquina de calcular semelhante desenvolvida na aula passada contendo no entanto uma rea com 2 separadores (tabs). Num dos separadores iremos colocar os dois campos de edio destinados a receber os dois inteiros no segundo iremos colocar um campo de edio destinado visualizao do resultado da soma. A operao de soma ser efectuada quando o utilizador efectuar a mudana de separador. Na segunda aplicao iremos, utilizando a mesma estrutura base, colocar num dos separadores um campo de edio destinado recepo de um ficheiro que contem, em modo texto, linhas com a seguinte informao (1 registo em 3 linhas): 1243 Maria Jos Antnio 12/06/1980 1244 Rui Andrade da Silva 23/02/1978 .... Ao seleccionar-se o outro separador a aplicao responsvel por abrir o ficheiro visualizar o seu contedo numa grelha (JTable) Testados no Netbeans 6.7.1

Projecto para construo GUI com JTabbedPane

Os primeiros passos so similares em todos projectos do tipo Java Application. Se por ventura se esquecer de desactivar a checkbox onde diz para criar a classe Main pode corrigir esse pormenor copiando o contedo da funo main() da classe que serve de contentor da aplicao (dever ser em principio derivada da JFrame) para classe Main. No se esquea de importar o package onde est a classe que serve de contentor na classe Main. Se no pretender ter esse trabalho no active a checkbox Create.... Se no desactivar a referida checkbox ao executar a aplicao no lhe aparecer a janela da aplicao pois existir a funo main na classe Main (a funo main da classe Main estar vazia).
1 2

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTabbedPane.html http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html

Swing3

2009/10

1. Criamos um projecto novo. 1.Na escolha do tipo de projecto seleccione: Categories -> java e Projects -> Java Application. 2.Relativamente ao nome e a pasta onde o projecto ser guardado escolha MyTabSomador. A pasta onde guardado o projecto por defeito ..\My Documents\NetBeansProjects\. A pasta ter o nome do projecto ( MyTabSomador neste exemplo). Active s a opo Set as.. 3. Depois de se concluir o processo de criao do projecto, o IDE s apresenta-nos a estrutura do projecto na janela superior (no lado esquerdo). 4. Aps concluir a criao do projecto seleccione o projecto na rea dos projectos e com BDR ->New -> JFrame Form. 5. D o nome de MyTabSomadorUI ao frame e ao package MyTabSomadorPkg

O IDE cria uma classe derivada da JFrame com nome de MyTabSomadorUI e o correspondente contentor, form (componente visual). Na rea de edio existem agora dois botes Source e Design. O boto de Design permite adicionar componentes (botes, checkboxs, campos de edio) ao nosso form. Seleccionada a rea de Design surgem duas sub-reas adicionais: palette (para adio componentes) e properties (para alterao das propriedades dos conponentes) Quando seleccionada a rea de Design surgem, do lado esquerdo inferior a rea inspector (estrutura hierrquica dos componentes que esto no interior do contentor) e navigator quando seleccionada a opo source (com a estrutura da classe) Seleccione o contentor principal (JFrame) no inspector ou na prpria rea de edio e insira o componente Tabbed Pane. Depois coloque dentro dele (do jTabbedpane1) dois componentes Panel.

Swing3

2009/10

Seleccione o primeiro tab e coloque os seguintes componentes: dois labels e dois campos de edio. No segundo tab um label, um campo de edio e um boto (para sair da aplicao.

Como medida de segurana coloquem no boto cdigo responsvel pelo abandono da aplicao (ver aula anterior)

Swing3

2009/10

Na classe MyTabSomadorUI (MyTabSomadorUI.java) introduzam trs atributos inteiros; num1, num2 e soma. E passando ao prato principal seleccionem o jTabbedpane1 (melhor modo pelo inspector). Nas suas propriedades (poder ser pelo BDR ou pela janela das propriedades) localizem o evento stateChanged adicionem um manipulador. Dmlhe o nome MyTabStateChanged (caso utilizem a janela das propriedades por baixo da palete de containers e controls). Coloquem dentro do mtodo recm-criado
JTabbedPane tp = (JtabbedPane) evt.getSource(); int index = tp.getSelectedIndex(); if(index==0){ jTextField1.setColumns(6); jTextField1.setText(String.valueOf(num1)); jTextField2.setColumns(6); jTextField2.setText(String.valueOf(num2)); } if(index==1){ num1=Integer.parseInt(jTextField1.getText()); num2=Integer.parseInt(jTextField2.getText()); soma=num1+num2; jTextField3.setColumns(6); jTextField3.setText(String.valueOf(soma)); }

dever surgir uma mensagem de erro (o sistema desconhece a classe JtabbedPane) pois no importaram o package javax.swing. Coloquem no inicio do ficheiro, na linha a seguir declarao package.

2. Compilar e executar! Se os vossos poderes de magia forem bons e acima de tudo no cometeram nenhum engano :-) 3. No caso de efectuarem copy and past h um erro. Corrijam-no! Yes, you can!

Projecto para construo de GUI com JTable


Nesta seco iremos desenvolver a nossa segunda interface grfica que, utilizado um campo de edio, permita a introduo do nome de um ficheiro e visualize a informao nele contido numa tabela (JTable). Existem vrias possibilidades de se implementar esta aplicao. Correctamente, a implementao, deveria ser antecedida por um anlise e consequente projecto de implementao. Dado o carcter acadmico iremos saltar essa fase do processo pois est fora dos objectivos quer da disciplina quer da construo de GUIs em JAVA (Swing). Nesta aplicao poderamos implementar a leitura do ficheiro no mtodo que ser responsvel por manipular o evento associado mudana de estado do conjunto de separadores, mas iremos implementar uma classe auxiliar para efectuar a leitura do ficheiro (obviamente concretizado num objecto) e posteriormente utilizar esses dados para visualiz-los na tabela. 1. Criamos um projecto novo. D o nome de MyTableText (se preferir outro). 1. Aps concluir a criao do projecto (MyTableText) seleccione o projecto na rea dos projectos e com BDR ->New -> JFrame Form. 2. D o nome de MyTableTextUI frame e ao package MyTableTextPkg Swing3 2009/10 4

3. Acrescente ao contentor principal (MyTableText) um JTabbedPane e sobre ele dois JPanels (veja a aplicao desenvolvida anteriormente).

4. Coloque um campo de edio no primeiro tab e no segundo, uma JTable. Depois de inserida a tabela seleccione no inspector o identificador da tabela inserida, com BDR, escolha a opo: Table contents

5. A caixa de dilogo que o IDE lhe apresenta permite-lhe alterar as caractersticas tabela atravs da interface grfico do Netbeans. Existe a possibilidade de se alterar estas caractersticas atravs de linha de cdigo (veremos esse processo mais adiante).

Swing3

2009/10

6. Apague a 4 coluna e altere as caractersticas das primeiras trs. Altere os ttulos, o tipo de contedo (para String) e desactive as checkboxs Resizable e Editable. No pretendemos alterar o contedo da tabela nem permitir ao utilizador redimensionar a largura das colunas. Os nomes das colunas foram propositadamente mal escritos para poderem ter a possibilidade de os alterar via linhas de cdigo.

7. Redimensione a tabela de modo a permitir a adio de um boto que permita ao utilizador sair da aplicao.

Swing3

2009/10

8. Coloque o cdigo de modo a que o boto sair permita o abandono do programa. Se no souber veja os exemplos anteriores. 9. Chegou a altura de criar a classe auxiliar. Seleccione o projecto e adicione uma nova classe. D o nome de CarregaFicheiro e ao package CarregaFicheiroPkg.

10. Adicione, classe CarregaFicheiro os atributos:


public String Nomeficheiro; public Object f[][]; int NumLinhas;

O atributo NomeFicheiro para guardar o nome do ficheiro para eventualmente se guardar possveis alteraes que se efectuem na tabela. No se esqueam que o que estar disponvel na tabela o contedo da ficheiro e eventualmente pode-se pretender gravar as alteraes (nesta aplicao no ser possvel pois na construo do componente jTable1 desactivamos essa possibilidade). O atributo f[][], uma referncia para uma matriz bidimensional do tipo Object3 que a classe que d origem a todas classes da API do java. Todas classes do java tm a classe Object como super classe. Se estiveram com ateno s aulas tericas de POO no tero problemas de compreender a colocao de um conjunto de Strings dentro de f[][]. Revejam o conceito de polimorfismo. O terceiro atributo, NumLinhas um inteiro para guardar o nmero de linhas. O Nmero de registos ser igual ao numero de linhas que o ficheiro contiver a dividir por 3 (no se esqueam que 3 linhas contguas contm informao de um sujeito). 11. E um construtor que receba uma String (d o nome de ficheiro) e contenha no seu interior:
NumLinhas=0; Nomeficheiro= new String(ficheiro); String str; // determinao do numero de linhas // cdigo da TP2 try { BufferedReader in = new BufferedReader(new FileReader(Nomeficheiro)); str = ""; while ((str = in.readLine()) != null) {
3

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html

Swing3

2009/10

NumLinhas++; //System.out.println(str); } } catch (IOException e) { System.out.println("Erro de entrada 1\n"); } // sabendo o numero de linhas teremos NumLinhas/3 linhas por 3 colunas // que sero Numero, Nome e Data de nascimento // construo do f com vector bidimensional de Objects f=new Object[NumLinhas/3][3]; int i,j; int NumReg=NumLinhas/3; // E agora a carga do ficheiro para o f[][] try { BufferedReader in = new BufferedReader(new FileReader(Nomeficheiro)); for(i=0; i<NumReg; i++){ for(j=0; j<3; j++){ str = in.readLine(); f[i][j]=str; // confuso??? Porqu??? // lembra-se da aula T2 os filhos herdam caractersticas dos pais // e String derivada da classe Object!!! } } } catch (IOException e) { System.out.println("Erro de entrada 2\n"); } // Este bloco s funcional se o programa for evocado // numa janela consola (cmd) System.out.println("Numero de Registos:" + NumReg); for(i=0; i<NumReg; i++){ for(j=0; j<3; j++){ System.out.print(f[i][j]+ " "); } System.out.println(""); }

Talvez seja necessrio incluir tambm java.io.* Depois da declarao de package no inicio do ficheiro CarregaFicheiro.java

12. Agora s falta incorporar na nossa interface MyTableTextUI a funcionalidade que ir utilizar a classe CarregaFicheiro. Coloque a importao dos seguintes pakages:
import CarregaFicheiroPkg.*; import javax.swing.*; import javax.swing.table.*; // para JDefaultTable

Na classe MyTableTextUI adicione o seguinte atributo:


CarregaFicheiro F;

Swing3

2009/10

13. Adicione, no conjunto de separadores (jTabbedPane1), o mtodo responsvel por manipular o evento responsvel pela mudana de separador. Pode efctuar de pois modos. Pelo inspector ou pela rea de atributos ->events ->stateChanged

Ao mtodo d o nome de MudaEstadoSeparadores (coloque s o nome, o IDE construiro mtodo) e coloque o seguinte cdigo:
private void MudaEstadoSeparadores(javax.swing.event.ChangeEvent evt) { // TODO add your handling code here: int i; // esta varivel poder ser utilizada para efectuar testes para validar sucessivas // mudanas de separador String str; JTabbedPane tp = (JTabbedPane) evt.getSource(); // evt o evento que accionou este metodo // tp uma referncia para objecto JTabbedPane que evocou o envento int index = tp.getSelectedIndex(); // index ter 0 ou 1 pois temos dois separadores // TAMBM PODEMOS // int index = jTabbedPane1.getSelectedIndex(); // nesse caso no necessitamos do objecto tp if(index==0){ // cdigo para verificar se o ficheiro vlido // ou outro que seja necessrio!!!! } if(index==1){ str=jTextField1.getText(); F=new CarregaFicheiro(str); // talvez erro: mtodo no publico // carrega as linhas do ficheiro; Object colunas[]={"Numero", "Nome", "Data Nasc."}; Object linhas[][]=F.f; DefaultTableModel modelo= new DefaultTableModel(linhas, colunas); jTable1.setModel(modelo); } }

Swing3

2009/10

2. Coloque o ficheiro Dados.txt na raiz do projecto e compile -> execute. 3. Para consolidar os vossos conhecimentos prticos podero alterar a aplicao de modo a que se o utilizador regressar ao 1 separador e introduzir outro ficheiro, com a mesma estrutura obviamente, a aplicao colocar o seu contedo a seguir ao do primeiro ficheiro. Se o ficheiro for o mesmo no passa nada. Considere a possibilidade do utilizador efectuar esta operao repetidamente!!!..

Swing3

2009/10

10

Potrebbero piacerti anche