Material de Aulas Java-5 CLASSES DO PACOTE Swing Inicialmente as classes disponíveis no Java apropriadas para a criação de aplicações gráficas foram disponibilizadas no pacote AWT ( Abstract Window Tookit). Na evolução, este pacote foi substituído pelo swing, pertencente a biblioteca JFC (Java Foundation Classes), portanto o swing é uma extensão das classes da AWT, sendo parte integrante do Java 2. As classes swing possuem diversas vantagens e muitos aprimoramentos em relação as classes da AWT – melhor aparência, melhor tratamento de eventos, recursos estendidos, entre outros. A diferença básica entre as classes do swing em relação as do pacote AWT esta na presença da letra (J) antes do inicio do nome da classe. Ex. Para inserir um botão do pacote AWT, e usada a classe Button, já para usar um botão do pacote swing, e usada a classe JButton. O mesmo vale para todas as classes do swing, pois todas iniciam com (J). As aplicações gráficas são aquelas que possibilitam a criação de uma GUI (Graphical User Interface – Interface Gráfica do Usuário). Ao desenvolver uma aplicação dotada de GUI, é necessário definir quais componentes serão utilizados e qual a disposição que eles terão na janela. O swing possui inúmeras classes para este objetivo. Todas as classes swing são extensões do pacote AWT que por sua vez, são extensões da classe java.lang.Objet ( a super classe de todas as classes do Java). Todas as classes que usaremos, necessitarão de diversas classes externas, tanto do pacote swing como do AWT. Por este motivo todos os programas terão três linhas com a diretiva import apontando para as classes externas: import java.awt.*; - permite a utilização de diversas classes do pacote AWT, além de possuir uma série de constantes numéricas. import java.awt.event.*; - usado para o processamento dos eventos que ocorrerão na janela, tais como: Click no Mouse, Enter do campo texto, etc. import java.Swing.*; - permite a utilização de diversas classes do pacote swing. Criação de Frames Frame é o componente do pacote AWT responsável pela criação de janelas, parecidas com as encontradas em aplicativos do ambiente Windows. O componente frame gera uma janela com barra de título, bordas e pode ter outros componentes em seu interior. Prof. Walcyr 1 Material de Aulas Java-5 Exemplo: Programa que mostra um frame com o título “Minha primeira Janela em Java”. Toda aplicação gráfica necessita utilizar as funcionalidades da classe JFrame, responsável por controlar a exibição da janela. (Herança). Estes comandos se não forem colocados, a janela do DOS não poderia ser fechada pelo simples pressionar do botão X Resumo dos métodos mais utilizados da classe JFrame. Método JFrame() getTitle() is Resizable() setResizable(boolean) setTitle(String) Função Cria uma janela vazia Obtém o título da janela Verifica se a janela é ou não dimensionável Especifica se a janela é ou não dimensionável Especifica o título da janela Inclusão de Textos e Imagens na Janela Para a inclusão de texto nos frames, é necessária a utilização da classe JLabel. É possível controlar várias propriedades do texto a ser utilizado, tais como: alinhamento, tipo de letra, tamanho, cor, etc. A declaração de um objeto JLabel no programa observa a seguinte sintaxe: Prof. Walcyr 2 Material de Aulas Java-5 JLabel <nome do label> = new JLabel(“<texto do label>”,JLabel.<alinhamento>) Para inclusão de imagens na janela, pode ser usada a classe ImageIcon por meio da sintaxe: ImageIcon<nome do ícone> = new ImageIcon(“Caminho e nome da imagem a ser inserida>). Ao inserir o caminho do arquivo, deve ser utilizada a barra normal (/). A barra invertida (\) é considerada caractere reservado para a quebra de linha. Exemplo de um programa que usa a classe JLabel para incluir textos e figuras em uma janela. import java.awt.*; import java.awt.event.*; import javax.swing.*; class Exemplo0902 extends JFrame { JLabel L1, L2, L3, L4; ImageIcon icone = new ImageIcon("E:/Dados/FATEC/JAVA/Exemplos Sergio/painting.gif"); Exemplo0902() { setTitle("Inserindo Labels e Imagens na Janela"); setSize(350,120); setLocation(50,50); getContentPane().setBackground(new Color(220,220,220)); L1 = new JLabel(" Aprendendo",JLabel.LEFT); L1.setForeground(Color.red); L2 = new JLabel(icone); L3 = new JLabel("Inserir ",JLabel.RIGHT); L3.setForeground(Color.blue); L4 = new JLabel("Labels e Imagens",icone,JLabel.CENTER); L4.setFont(new Font("Serif",Font.BOLD,20)); L4.setForeground(Color.black); getContentPane().setLayout(new GridLayout(4,1)); //Divide a Janela em 4 linhas e uma coluna getContentPane().add(L1); getContentPane().add(L2); getContentPane().add(L3); getContentPane().add(L4); } public static void main(String args[]) { JFrame Janela=new Exemplo0902(); Janela.show(); WindowListener x = new WindowAdapter() { public void windowClosing(WindowEvent e) Prof. Walcyr 3 Material de Aulas Java-5 { System.exit(0); } }; Janela.addWindowListener(x); } } Declaração dos objetos da classe JLabel, utilizados para armazenar e manipular o texto. Eles são alinhados durante o processo de inicialização por meio de constantes inteiras prédefinidas pela linguagem (JLabel.LEFT que equivale a zero, JLabel.CENTER que equivale a um e JLabel.RIGHT que equivale a dois). Quando o alinhamento não for especificado, o default é à esquerda. Definição da cor da fonte do objeto L1. Interpretada como objeto L1 utilize a cor de fonte (setForeground) vermelha. Inicialização do Label L2 com o objeto ícone. Inicialização do Label L4 com um texto e uma imagem. Formatação do texto do Label L4. Ao usar o método add(), os componentes são inseridos linha a linha (de cima para baixo). No caso de frame com mais de uma coluna, o preenchimento seria: linha1_coluna1 e assim por diante. Prof. Walcyr Declaração de um ícone que será usado em conjunto com um label. O objeto ícone está sendo declarado e inicializado com o endereço em que a imagem se localiza a partir da unidade (E). Definição da cor de fundo da janela utilizando setBackground. Os números que aparecem referem se ao padrão RGB (RedGreen_Blue) e definem as tonalidades das cores vermelha, verde e azul. Os números para a tonalidade podem variar de 0 a 255. Todos os componentes visualizados nas janelas: Labels, botões, caixas de texto, etc necessitam ser inseridos em locais pré-definidos da janela, conhecidos como células. Neste caso setLayout() define o frame composto por uma grade de 4 linhas e uma coluna (4.1). Célula 1 Célula 2 Célula 3 Célula 4 4 Material de Aulas Java-5 Resumo dos métodos mais utilizados da classe JLabel: Método JLabel() JLabel(String) JLabel(String,int) JLabel(String, image) JLabel(String, image, int) getText() setText() Função Cria um Label sem texto Cria um Label com o texto dado Cria um Label com o texto e alinhamento dados Cria um Label com o texto e imagem dados Cria um Label com o texto, imagem e alinhamento dados Obtém o texto do Label Especifica o texto do Label Inclusão de Botões nas Janelas Para inclusão de botões nos frames, é utilizada a classe JButton. Da mesma forma que no JLabel, muitas propriedades podem ser manipuladas em JButton. Observe o exemplo: import java.awt.*; import java.awt.event.*; import javax.swing.*; Prof. Walcyr 5 Material de Aulas Java-5 public class Exemplo0903 extends JFrame implements ActionListener { JButton b1,b2; ImageIcon icone = new ImageIcon("C:/Livros/Java/busca.gif"); public Exemplo0903() { setTitle("Inserindo botoes na janela"); setSize(350,100); setLocation(50,50); getContentPane().setBackground(new Color(180,180,180)); b1 = new JButton("Busca",icone); b1.setHorizontalTextPosition(AbstractButton.LEFT);//posicao do texto // b1.setVerticalTextPosition(AbstractButton.TOP);//posicao do texto b1.setBackground(new Color(100,180,180));//cor de fundo do botão b1.setForeground(Color.black);//cor do titulo do botão b1.setFont(new Font("ScriptS",Font.BOLD,20)); //define a fonte do botão b1.setEnabled(true); b1.addActionListener(this); b1.setToolTipText("Pressione aqui para realizar uma busca"); b1.setMnemonic(KeyEvent.VK_B); // b1.setActionCommand("botao1");//define o nome da acao b2 = new JButton("Cancelar"); b2.addActionListener(this); b2.setMnemonic(KeyEvent.VK_C); b2.setToolTipText("Pressione aqui para cancelar"); getContentPane().setLayout(new FlowLayout()); //gerenciador de layout getContentPane().add(b1); getContentPane().add(b2); } public void actionPerformed(ActionEvent e) { // metodo implementado pelo ActionListener if (e.getSource()==b1) { System.out.println("Botao 1 pressionado"); } if (e.getSource()==b2) { System.out.println("Botao 2 pressionado"); } } public static void main(String args[]) { JFrame Janela = new Exemplo0903(); Prof. Walcyr 6 Material de Aulas Java-5 Janela.show(); //para fechar a janela WindowListener x = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; Janela.addWindowListener(x); } } Em qualquer aplicação em que as ações do usuário devem ser interpretadas quando ele interagir com a janela (clicar num botão, por exemplo), é necessária a implementação de uma interface. Um objeto do tipo botão também pode ser inicializado com texto, imagem. O método addActionListener(this) tem a função de registrar o botão b1 para que um evento seja gerado por ele. Todo objeto inserido em um frame deve ser registrado para que os eventos gerados por ele sejam reconhecidos. Adiciona uma letra sublinhada ao título do botão e permite usar tecla Alt juntamente com a letra em substituição ao mouse. setToolTipText – método para adicionar uma mensagem ao botão. Pode ser usado em outros tipos de botão (CheckBox, Radio,etc.). O gerenciador FlowLayout() possibilita que os componentes sejam distribuídos em linhas, como nos editores de texto. Prof. Walcyr 7 Material de Aulas Java-5 Devido ao fato de não existir um método para cada evento dos componentes de uma janela, dentro do método actionPerformed() é necessário verificar qual dos componentes é responsável pela geração do evento. A letra (e) é declarada como um objeto da classe ActionEvent e receberá todos os chamados aos eventos da janela. Prof. Walcyr 8 Material de Aulas Java-5 Resumo dos métodos mais utilizados da classe JLabel: Método Button() Button(String) Button(String,Image) getLabel() setLabel(String) setEnable(boolean) setHorizontalTextPosition() setMnemonic setToolTipText setVerticalTextPosition Prof. Walcyr Função Cria um botão sem texto Cria um botão com o texto dado Cria um botão com o texto e imagem dados Obtém o texto do botão Especifica o texto do botão Define se o botão está habilitado (true) ou desabilitado (false) Define o tipo de alinhamento horizontal do texto em relação a uma imagem. Pode assumir LEFT (esquerda) ou RIGHT (direita). Define uma letra que será usada como acionadora do evento click, em conjunto com a tecla ALT. Possibilita atrelar uma mensagem ao botão. Quando o ponteiro do mouse estaciona sobre o botão, a mensagem é apresentada. Define o tipo de alinhamento vertical do texto em relação a uma imagem. Pode assumir TOP (topo) ou BOTTON (abaixo). 9 Material de Aulas Java-5 Inclusão de Caixas de Texto Para inclusão de caixas de texto nos frames, é utilizada a classe JTextField que também possui várias propriedades que podem ser modificadas. O programa abaixo mostra o uso de caixas de texto e botão nos frames, solicitando o nome de uma pessoa: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class C11EX04 extends JFrame { JTextField TEXTO; JLabel ROTULO; public C11EX04() { super("Formulário 4"); Container CONT = getContentPane(); JButton BOTAO = new JButton("OK"); TEXTO = new JTextField(); ROTULO = new JLabel("Texto"); setLayout(null); CONT.add(TEXTO); CONT.add(BOTAO); CONT.add(ROTULO); TEXTO.reshape(138,20,150,20); BOTAO.reshape(138,50,70,20); ROTULO.reshape(138,80,160,20); Captura EVENTO = new Captura(); BOTAO.addActionListener(EVENTO); setSize(427, 273); setVisible(true); } private class Captura implements ActionListener { Prof. Walcyr 10 Material de Aulas Java-5 public void actionPerformed(ActionEvent ae) { String SAIDA = TEXTO.getText(); ROTULO.setText(SAIDA); } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); C11EX04 VISUAL = new C11EX04(); VISUAL.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ); } } Prof. Walcyr 11 Material de Aulas Java-5 Definição da classe Captura, que implementa a partir da interface ActionListener o controle das ações executadas por um usuário sobre os componentes em uso no formulário ativo. Este evento é responsável pela ação do botão OK quando ele é disparado na interface gráfica. Quando o botão JButton() é acionado, ocorre um evento, que é capturado e tratado pela classe Captura() que associa o evento executado à variável objeto EVENTO. O programa de exemplo demonstra uma simples calculadora em que o usuário digita 2 números em 2 JTextFields e clica em um dos 4 botões existentes no frame (+,-,*e/) para realizar um cálculo. Este exemplo agrupa as classe JFrame, JLabel e JButton estudadas até aqui. import java.awt.*; import java.awt.event.*; import javax.swing.*; class Exemplo0904 extends JFrame implements ActionListener, TextListener { JLabel L1,L2,L3; JButton B1, B2, B3, B4, B5; JTextField T1,T2,T3; public static void main(String args[]) { JFrame Janela=new Exemplo0904(); Janela.show(); //para fechar a janela WindowListener x = new WindowAdapter() { public void windowClosing(WindowEvent e) { Prof. Walcyr 12 Material de Aulas Java-5 System.exit(0); } }; Janela.addWindowListener(x); } Exemplo0904() { setTitle("Calculadora"); setSize(350,90); setLocation(50,50); getContentPane().setBackground(new Color(150,150,150)); getContentPane().setLayout(new GridLayout(3,4)); L1 = new JLabel("Num.1"); L1.setForeground(Color.black); L1.setFont(new Font("",Font.BOLD,14)); L2 = new JLabel("Num.2"); L2.setForeground(Color.black); L2.setFont(new Font("",Font.BOLD,14)); L3 = new JLabel("Total"); L3.setFont(new Font("",Font.BOLD,14)); B1 = new JButton ("+"); B1.addActionListener(this); B2 = new JButton ("-"); B2.addActionListener(this); B3 = new JButton ("x"); B3.addActionListener(this); B4 = new JButton ("/"); B4.addActionListener(this); B5 = new JButton ("Limpar"); B5.addActionListener(this); B5.setBackground(Color.black); B5.setForeground(Color.white); T1 = new JTextField(); T2 = new JTextField(); T3 = new JTextField(); // T1.addTextListener(this); T3.setEditable(false); //define que o textField como somente leitura getContentPane().add(L1); getContentPane().add(T1); getContentPane().add(B1); getContentPane().add(B2); getContentPane().add(L2); getContentPane().add(T2); getContentPane().add(B3); getContentPane().add(B4); getContentPane().add(L3); getContentPane().add(T3); getContentPane().add(B5); } public void actionPerformed(ActionEvent e) Prof. Walcyr 13 Material de Aulas Java-5 { if (e.getSource()==B5) { T1.setText(""); T2.setText(""); T3.setText(""); return; } float N1=0,N2=0,result=0; try { N1 = Float.parseFloat(T1.getText()); N2 = Float.parseFloat(T2.getText()); } catch (NumberFormatException erro) { T3.setText("Erro"); return; } if (e.getSource()==B1) { result = N1 + N2; } if (e.getSource()==B2) { result = N1 - N2; } if (e.getSource()==B3) { result = N1 * N2; } if (e.getSource()==B4) { result = N1 / N2; } T3.setText(""+result); } public void textValueChanged(TextEvent e) {T3.setText("Ola"); } } Prof. Walcyr 14 Material de Aulas Java-5 Declaração de 3 caixas de texto Prof. Walcyr 15 Material de Aulas Java-5 Inicialização e registro dos 5 botões usados na aplicação Inicializam as caixas de texto em branco. Adicionam todos os objetos à janela, na ordem que aparecem Método actionPerformed utilizado para manipular todas as ações da aplicação. Este método recebe um Action Event para verificar e reconhecer qual foi o objeto que disparou o evento. Conversão dos valores digitados em numéricos Para cada operação disponível na calculadora existe um método e.getSource com a função de reconhecer o evento gerado. A variável result é utilizada para armazenar o resultado da operação escolhida, porém trata-se de uma variável numérica que não pode ser inserida diretamente em uma caixa de texto. Este método demonstra como é simples a conversão de número em texto por meio de “”+result, ou seja, o resultado da operação é concatenado com um texto vazio. Quando um número é concatenado com um texto, o resultado final se transforma em texto. Prof. Walcyr 16 Material de Aulas Java-5 A Tabela mostra um resumo dos métodos mais utilizados da classe JTextField Método JTextField() JTextField(String) JTextField(String,Int) JTextField(int) getText() getSelectText() isEditable() selectAll() setEditable(Boolean) setText() Função Cria uma caixa de texto vazia Cria uma caixa de texto com a string dada Cria uma caixa de texto com a string e a quantidade de colunas especificada. Cria uma caixa de texto com a quantidade de colunas especificada Obtém o texto do objeto Obtém o texto selecionado no objeto Verifica se o componente é editável ou não Seleciona todo o texto Especifica se o componente é editável ou não Especifica o texto a ser contido no componente Inclusão de Caixas de Senha Para inclusão de caixas de senha nos frames, é utilizada a classe JPasswordField. O caractere default que aparece no momento da digitação é o (*), entretanto qualquer caractere pode ser definido pelo método setEchoChar(). No exemplo de programa a seguir, é feita a verificação de senha e imprimirá uma mensagem que mostra se a senha foi aceita ou não. A comparação é feita com a palavra JAVA. import java.awt.*; import java.awt.event.*; import javax.swing.*; class Exemplo0905 extends JFrame implements ActionListener { JLabel L1,L2; JTextField T1; JPasswordField P1; public static void main(String args[]) { JFrame Janela=new Exemplo0905(); Janela.show(); //para fechar a janela WindowListener x = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } Prof. Walcyr 17 Material de Aulas Java-5 }; Janela.addWindowListener(x); } Exemplo0905() { setTitle("Verifica Senha"); setSize(350,65); getContentPane().setBackground(new Color(150,150,150)); getContentPane().setLayout(new GridLayout(2,2)); L1 = new JLabel("Digite a SENHA:"); L2 = new JLabel("Validacao:"); L1.setForeground(Color.black); L2.setForeground(Color.black); L1.setFont(new Font("",Font.BOLD,14)); L2.setFont(new Font("",Font.BOLD,14)); T1 = new JTextField(); T1.setForeground(Color.red); P1 = new JPasswordField(); P1.setEchoChar('?'); P1.addActionListener(this); //registra o P1 getContentPane().add(L1); getContentPane().add(P1); getContentPane().add(L2); getContentPane().add(T1); } public void actionPerformed(ActionEvent e) { if (P1.getText().equals("JAVA")) T1.setText("Senha Valida"); else T1.setText("Senha Invalida"); } } Prof. Walcyr 18 Material de Aulas Java-5 Declaração de P1 como sendo um objeto da classe JPasswordField Inicialização do objeto JPasswordField P1 com conteúdo vazio, igual como é feito com um objeto do tipo JTextField. Define o caractere que substituirá o caractere digitado. Se esta linha não for declarada, o caractere (*) será usado. Registra o objeto P1 para gerar um evento, da mesma forma que um botão é registrado. Esse evento será gerado quando um usuário pressionar ENTER quando o foco estiver sobre o objeto P1. Prof. Walcyr 19 Material de Aulas Java-5 Formatação de Caixas de Texto Em muitos casos torna-se necessário realizar formatação de caixas de texto, principalmente quando valores numéricos são inseridos. import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.text.NumberFormat; class Exemplo0906 extends JFrame implements ActionListener { JTextField T1,T2; double valor1 = 1000.54; int valor2 = 100; NumberFormat df1,df2; public static void main(String args[]) { JFrame Janela=new Exemplo0906(); Janela.show(); WindowListener x = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; Janela.addWindowListener(x); } Exemplo0906() { setTitle("Formatando numero"); setSize(350,65); getContentPane().setBackground(new Color(150,150,150)); getContentPane().setLayout(new GridLayout(1,2)); df1 = NumberFormat.getNumberInstance(); df1.setMinimumFractionDigits(4); df2 = NumberFormat.getNumberInstance(); df2.setMinimumFractionDigits(2); T1 = new JTextField(); T2 = new JTextField(); T1.setText(""+df1.format(valor1)); T2.setText(""+df2.format(valor2)); getContentPane().add(T1); Prof. Walcyr 20 Material de Aulas Java-5 getContentPane().add(T2); } public void actionPerformed(ActionEvent e) {} } Importação da classe NumberFormat para formatação de números Declaração de 2 objetos df1 e df2 que serão instâncias da classe NumberFormat Inicialização dos objetos df1 e df2 com a instância default da máquina do usuário, definida pelo S.O. O Windows por exemplo, define estas características por meio do painel de controle. Os comandos posteriores definem a quantidade de casas decimais. Formatação do número de acordo com o formato definido pelo método format. Aplicação Contextualizada O programa a seguir baseado no C04EX01 que faz a solicitação do nome, da idade e da altura de uma pessoa é apresentado na versão gráfica. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class C11EX05 extends JFrame { JTextField TEXT1; JTextField TEXT2; JTextField TEXT3; JLabel ROTUL1; JLabel ROTUL2; JLabel ROTUL3; Prof. Walcyr 21 Material de Aulas Java-5 public C11EX05() { super("Ficha Biométrica"); Container CONT = getContentPane(); JLabel ROTUL4 = new JLabel("Nome:"); JLabel ROTUL5 = new JLabel("Idade:"); JLabel ROTUL6 = new JLabel("Altura:"); TEXT1 = new JTextField(); TEXT2 = new JTextField(); TEXT3 = new JTextField(); JButton BOTAO = new JButton("OK"); JLabel ROTUL7 = new JLabel("Nome:"); JLabel ROTUL8 = new JLabel("Idade:"); JLabel ROTUL9 = new JLabel("Altura:"); ROTUL1 = new JLabel(); ROTUL2 = new JLabel(); ROTUL3 = new JLabel(); setLayout(null); CONT.add(ROTUL4); CONT.add(ROTUL5); CONT.add(ROTUL6); CONT.add(TEXT1); CONT.add(TEXT2); CONT.add(TEXT3); CONT.add(BOTAO); CONT.add(ROTUL7); CONT.add(ROTUL8); CONT.add(ROTUL9); CONT.add(ROTUL1); CONT.add(ROTUL2); CONT.add(ROTUL3); ROTUL4.reshape(30,20,150,20); ROTUL5.reshape(30,50,150,20); Prof. Walcyr 22 Material de Aulas Java-5 ROTUL6.reshape(30,80,150,20); TEXT1.reshape(80,20,150,20); TEXT2.reshape(80,50,150,20); TEXT3.reshape(80,80,150,20); BOTAO.reshape(95,110,70,20); ROTUL7.reshape(30,140,150,20); ROTUL8.reshape(30,170,150,20); ROTUL9.reshape(30,200,150,20); ROTUL1.reshape(80,140,150,20); ROTUL2.reshape(80,170,150,20); ROTUL3.reshape(80,200,150,20); AcionaBotao EVENTO = new AcionaBotao(); BOTAO.addActionListener(EVENTO); setSize(273, 273); setVisible(true); } private class AcionaBotao implements ActionListener { public void actionPerformed(ActionEvent ae) { String NOME = TEXT1.getText(); String IDADE = TEXT2.getText() + " anos"; String ALTURA = TEXT3.getText(); ROTUL1.setText(NOME); ROTUL2.setText(IDADE); ROTUL3.setText(ALTURA); } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); C11EX05 VISUAL = new C11EX05(); VISUAL.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Prof. Walcyr 23 Material de Aulas Java-5 } } ); } } Prof. Walcyr 24 Material de Aulas Java-5 O programa C04EX02 que calcula o salário líquido de um profissional que trabalhe por hora foi agora transformado em interface gráfica. import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.text.*; import java.text.DecimalFormat; public class C11EX07 extends JFrame { JTextField TEXT1; JTextField TEXT2; JTextField TEXT3; JLabel ROTUL1; JLabel ROTUL2; JLabel ROTUL3; public C11EX07() { super("Salário"); Container CONT = getContentPane(); Prof. Walcyr 25 Material de Aulas Java-5 JLabel ROTUL4 = new JLabel("Entre horas trabalhadas:"); JLabel ROTUL5 = new JLabel("Entre valor da hora:"); JLabel ROTUL6 = new JLabel("Entre percentual de desconto:"); TEXT1 = new JTextField(); TEXT2 = new JTextField(); TEXT3 = new JTextField(); TEXT1.setDocument(new AceitaVlrNumFloat()); TEXT2.setDocument(new AceitaVlrNumFloat()); TEXT3.setDocument(new AceitaVlrNumFloat()); JButton BOTAO = new JButton("OK"); JLabel ROTUL7 = new JLabel("Salário Bruto::"); JLabel ROTUL8 = new JLabel("Desconto:"); JLabel ROTUL9 = new JLabel("Salário Liquido:"); ROTUL1 = new JLabel(); ROTUL2 = new JLabel(); ROTUL3 = new JLabel(); setLayout(null); CONT.add(ROTUL4); CONT.add(ROTUL5); CONT.add(ROTUL6); CONT.add(TEXT1); CONT.add(TEXT2); CONT.add(TEXT3); CONT.add(BOTAO); CONT.add(ROTUL7); CONT.add(ROTUL8); CONT.add(ROTUL9); CONT.add(ROTUL1); CONT.add(ROTUL2); CONT.add(ROTUL3); ROTUL4.reshape(30,20,170,20); ROTUL5.reshape(30,50,170,20); ROTUL6.reshape(30,80,170,20); TEXT1.reshape(217,20,150,20); Prof. Walcyr 26 Material de Aulas Java-5 TEXT2.reshape(217,50,150,20); TEXT3.reshape(217,80,150,20); BOTAO.reshape(30,110,70,20); ROTUL7.reshape(30,140,150,20); ROTUL8.reshape(30,170,150,20); ROTUL9.reshape(30,200,150,20); ROTUL1.reshape(217,140,150,20); ROTUL2.reshape(217,170,150,20); ROTUL3.reshape(217,200,150,20); AcionaBotao EVENTO = new AcionaBotao(); BOTAO.addActionListener(EVENTO); setSize(410, 273); setVisible(true); } public class AceitaVlrNumFloat extends PlainDocument { public void insertString(int VLR, String TXT, AttributeSet ATRIB) throws BadLocationException { char CARACTERE; byte NUMERO = 1, I = 0; for (I = 0; I < TXT.length(); I++) { CARACTERE = TXT.charAt(I); if (!Character.isDigit(CARACTERE) & CARACTERE != '.') NUMERO = 0; } if(NUMERO != 0) super.insertString(VLR, TXT, ATRIB); } } private class AcionaBotao implements ActionListener { public void actionPerformed(ActionEvent ae) { float HT, VH, PD, TD, SB, SL; DecimalFormat df = new DecimalFormat("0.00"); String SHT = TEXT1.getText(); String SVH = TEXT2.getText(); String SPD = TEXT3.getText(); Prof. Walcyr 27 Material de Aulas Java-5 HT = Float.valueOf(SHT).floatValue(); VH = Float.valueOf(SVH).floatValue(); PD = Float.valueOf(SPD).floatValue(); SB = HT * VH; TD = (PD / 100) * SB; SL = SB - TD; ROTUL1.setText(String.valueOf(df.format(SB))); ROTUL2.setText(String.valueOf(df.format(TD))); ROTUL3.setText(String.valueOf(df.format(SL))); } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); C11EX07 VISUAL = new C11EX07(); VISUAL.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ); } } Prof. Walcyr 28 Material de Aulas Java-5 Método showMessageDialog É muito comum a necessidade de transmitir mensagem de erro ou avisos. Para usar este recurso utiliza-se o método showMessageDialog() pertencente à classe JOptionPane. Este método possibilita a definição entre 2 e 6 parâmetros devido a seu recurso de sobrecarga. Para usar este método, com 2 parâmetros, consideraremos o programa C05EX04 que apresenta a mensagem O valor está entre 20 e 90, caso o valor fornecido esteja nesta faixa. Caso contrário apresenta O valor não está entre 20 e 90. import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.text.*; public class C12EX01 extends JFrame { JTextField TEXT1; public C12EX01() { super("Validação Numérica"); Container CONT = getContentPane(); Prof. Walcyr 29 Material de Aulas Java-5 JLabel ROTUL1 = new JLabel("Entre um valor numérico inteiro:"); TEXT1 = new JTextField(); JButton BOTAO = new JButton("OK"); TEXT1.setDocument(new AceitaVlrNumInt()); setLayout(null); CONT.add(ROTUL1); CONT.add(TEXT1); CONT.add(BOTAO); ROTUL1.reshape(30,30,185,20); TEXT1.reshape(225,30,50,20); BOTAO.reshape(120,80,70,20); AcionaBotao EVENTO = new AcionaBotao(); BOTAO.addActionListener(EVENTO); setSize(310, 160); setVisible(true); } public class AceitaVlrNumInt extends PlainDocument { public void insertString(int VLR, String TXT, AttributeSet ATRIB) throws BadLocationException { char CARACTERE; byte NUMERO = 1, I = 0; for (I = 0; I < TXT.length(); I++) { CARACTERE = TXT.charAt(I); if (!Character.isDigit(CARACTERE)) NUMERO = 0; } if(NUMERO != 0) super.insertString(VLR, TXT, ATRIB); } } private class AcionaBotao implements ActionListener { public void actionPerformed(ActionEvent ae) { int NUMERO; String SNUM = TEXT1.getText(), TEXTO; Prof. Walcyr 30 Material de Aulas Java-5 NUMERO = Integer.valueOf(SNUM).intValue(); if (NUMERO >= 20 && NUMERO <= 90) { TEXTO = "O valor está entre 20 e 90"; JOptionPane.showMessageDialog(null, TEXTO); } else { TEXTO = "O valor não está entre 20 e 90"; JOptionPane.showMessageDialog(null, TEXTO); } } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); C12EX01 VISUAL = new C12EX01(); VISUAL.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ); } } Prof. Walcyr 31 Material de Aulas Java-5 Prof. Walcyr 32 Material de Aulas Java-5 Método showInputDialog Componente muito útil para entrada de dados, pertencente a classe JOptionPane. Para mostrar sua funcionalidade vamos ver o programa abaixo que faz a leitura de dois valores inteiros e apresenta o resultado com adição dos valores lidos. import javax.swing.*; public class C12EX03 { public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JDialog.setDefaultLookAndFeelDecorated(true); String SN1, SN2; int N1, N2, R; SN1 = JOptionPane.showInputDialog("Entre o 1o. valor:"); SN2 = JOptionPane.showInputDialog("Entre o 2o. valor:"); N1 = Integer.parseInt(SN1); N2 = Integer.parseInt(SN2); R = N1 + N2; JOptionPane.showMessageDialog(null, "Adição = " + R, "Resultado", 1); System.exit(0); } } ); } } Prof. Walcyr 33 Material de Aulas Java-5 Prof. Walcyr 34 Material de Aulas Java-5 Método showConfirmDialog Tem como finalidade apresentar uma caixa de confirmação para diversas aplicações, em que seja necessário obter uma resposta de confirmação ou não do usuário. As combinações possíveis de botões para este método são: Yes / No; Yes / No / Cancel e OK / Cancel. Para mostrar o uso do método showConfirmDialog com botões Yes e No vejamos o programa abaixo que solicita a entrada de 2 valores numéricos inteiros e apresenta como resultado o valor da multiplicação dos mesmos. import javax.swing.*; public class C12EX05 { public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JDialog.setDefaultLookAndFeelDecorated(true); String SN1, SN2; int N1, N2, R, RESP; Prof. Walcyr 35 Material de Aulas Java-5 do { SN1 = JOptionPane.showInputDialog ("Entre o 1o. valor:"); if (SN1 == null) N1 = 0; else N1 = Integer.parseInt(SN1); SN2 = JOptionPane.showInputDialog ("Entre o 2o. valor:"); if (SN2 == null) N2 = 0; else N2 = Integer.parseInt(SN2); R = N1 * N2; JOptionPane.showMessageDialog(null,"Multiplicação = " + R, "Resultado", 1); RESP = JOptionPane.showConfirmDialog(null, "Deseja mais cálculo?", "Resposta", JOptionPane.YES_NO_OPTION); } while (RESP == JOptionPane.YES_OPTION); System.exit(0); } } ); } } Prof. Walcyr 36 Material de Aulas Java-5 Prof. Walcyr 37 Material de Aulas Java-5 Prof. Walcyr 38 Material de Aulas Java-5 A linha de comando: RESP = JOptionPane.showConfirmDialog(null, "Deseja mais cálculo?", "Resposta", JOptionPane.YES_NO_OPTION); Retorna como resposta um valor int atribuído à variável RESP. O parâmetro JOptionPane.YES_NO_OPTION efetua a apresentação dos botões Yes e No. Este parâmetro pode ser configurado de 3 formas diferentes: 1. A constante YES_NO_OPTION da classe JOptionPane, apresenta os botões de resposta Yes, No. Em substituição ao valor definido para a classe constante JOptionPane.YES_NO_OPTION, pode-se usar o valor numérico 0 (zero). 2. A constante YES_NO_CANCEL_OPTION da classe JOptionPane, apresenta os botões de resposta Yes, No e Cancel. Em substituição ao valor definido para a classe constante JOptionPane.YES_NO_CANCEL_OPTION, pode-se usar o valor numérico 1 (um). 3. A constante OK_CANCEL_OPTION da classe JOptionPane, apresenta os botões de resposta OK e Cancel. Em substituição ao valor definido para a classe constante JOptionPane.OK_CANCEL_OPTION, pode-se usar o valor numérico 2 (dois). Ao selecionar o botão apresentado na caixa de confirmação, ele gera um valor para representar a sua ação. O valor obtido a partir do acionamento de um dos botões é verificado na linha de comando while (RESP == JOptionPane.YES_OPTION); Observe o uso da constante YES_OPTION, indicando que se ocorrer a seleção do botão YES, o programa continua a repetir sua ação; caso contrário, o programa é encerrado. Para a tomada de decisões é possível usar algumas variações das constantes de verificação definidas: a) A constante YES_OPTION da classe JOptionPane permite verificar se o botão Yes foi acionado. Podendo-se também usar o valor numérico 0 (zero). b) A constante NO_OPTION da classe JOptionPane permite verificar se o botão No foi acionado. Podendo-se também usar o valor numérico 1 (um). c) A constante CANCEL_OPTION da classe JOptionPane permite verificar se o botão Cancel foi acionado. Podendo-se também usar o valor numérico 2 (dois). d) A constante OK_OPTION da classe JOptionPane permite verificar se o botão OK foi acionado. Podendo-se também usar o valor numérico 0 (zero). Observar que as constantes YES_OPTION e OK_OPTION da classe JOptionPane retornam ambas o valor 0 (zero). Para testar as condições, usando o valor numérico 0 (zero) alteraremos o programa C12EX05 na linha de comando RESP, conforme programa C12EX06 a seguir. Prof. Walcyr 39 Material de Aulas Java-5 import javax.swing.*; public class C12EX06 { public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JDialog.setDefaultLookAndFeelDecorated(true); String SN1, SN2; int N1, N2, R, RESP; do { SN1 = JOptionPane.showInputDialog ("Entre o 1o. valor:"); if (SN1 == null) N1 = 0; else N1 = Integer.parseInt(SN1); SN2 = JOptionPane.showInputDialog ("Entre o 2o. valor:"); if (SN2 == null) N2 = 0; else N2 = Integer.parseInt(SN2); R = N1 * N2; JOptionPane.showMessageDialog(null,"Multiplicação = " + R, "Resultado", 1); RESP = JOptionPane.showConfirmDialog(null, "Deseja mais cálculo?", "Resposta", 0); } while (RESP == 0); System.exit(0); } } ); } } Prof. Walcyr 40 Material de Aulas Java-5 Método showOptionDialog Outra opção de comunicação com o usuário é a caixa de opção, a qual possui uma flexibilidade diferente das caixas de mensagem e da caixa de confirmação. Para usar este recurso deve-se utilizar o método showOptionDialog() pertencente a classe JOptionPane. Para usarmos este método desenvolveremos o programa abaixo que solicita a entrada de 2 valores numéricos inteiros e apresenta como resultado o quociente inteiro dos mesmos. import javax.swing.*; public class C12EX07 { public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JDialog.setDefaultLookAndFeelDecorated(true); Object[] OPCAO = { "Sim", "Não" }; String SN1, SN2; int N1, N2, R, RESP; do { Prof. Walcyr 41 Material de Aulas Java-5 SN1 = JOptionPane.showInputDialog ("Entre o 1o. valor:"); if (SN1 == null) N1 = 0; else N1 = Integer.parseInt(SN1); SN2 = JOptionPane.showInputDialog ("Entre o 2o. valor:"); if (SN2 == null) N2 = 0; else N2 = Integer.parseInt(SN2); R = N1 / N2; JOptionPane.showMessageDialog(null,"Divisão = " + R, "Resultado", 1); RESP = JOptionPane.showOptionDialog(null, "Deseja mais cálculo?", "Resposta", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, OPCAO, OPCAO[0]); } while (RESP == JOptionPane.YES_OPTION); System.exit(0); } } ); } } Prof. Walcyr 42 Material de Aulas Java-5 Prof. Walcyr 43 Material de Aulas Java-5 Um dos pontos importantes deste programa é a linha de comando Object[] OPCAO = {"Sim", "N"}; na qual é definido um objeto array denominado OPCAO com 2 valores possíveis Sim e Não. Prof. Walcyr 44 Material de Aulas Java-5 Método JRadioButton Proporciona a definição de um conjunto de opções por meio de botões de opção. Apenas uma das opções definidas é acionada para uma ação a ela relacionada seja executada. Para testar este método, vejamos o programa abaixo que solicita o nome de uma pessoa e sugere que ela selecione o seu sexo. Depois o programa apresenta uma mensagem apropriada de saudação para o sexo selecionado. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class C12EX08 extends JFrame { JTextField TEXT1; JRadioButton RADIO1 = new JRadioButton("Masculino",true); JRadioButton RADIO2 = new JRadioButton("Feminino"); public C12EX08() { super("Atendimento"); Container CONT = getContentPane(); ButtonGroup GRUPO = new ButtonGroup(); JLabel ROTUL1 = new JLabel("Entre seu nome:"); JLabel ROTUL2 = new JLabel("Selecione seu sexo:"); TEXT1 = new JTextField(); JButton BOTAO = new JButton("OK"); setLayout(null); GRUPO.add(RADIO1); GRUPO.add(RADIO2); CONT.add(ROTUL1); CONT.add(TEXT1); CONT.add(ROTUL2); CONT.add(RADIO1); CONT.add(RADIO2); CONT.add(BOTAO); ROTUL1.reshape(30,30,110,20); TEXT1.reshape(160,30,100,20); Prof. Walcyr 45 Material de Aulas Java-5 ROTUL2.reshape(30,60,130,20); RADIO1.reshape(160,60,100,20); RADIO2.reshape(160,80,100,20); BOTAO.reshape(120,120,70,20); AcionaBotao EVENTO = new AcionaBotao(); BOTAO.addActionListener(EVENTO); setSize(310, 200); setVisible(true); } private class AcionaBotao implements ActionListener { public void actionPerformed(ActionEvent ae) { String TEXTO; if (RADIO1.isSelected() == true) { TEXTO = "Olá, Senhor \n" + TEXT1.getText(); JOptionPane.showMessageDialog( null, TEXTO, "Saudação para homem", 1 ); } if (RADIO2.isSelected() == true) { TEXTO = "Olá, Senhora \n" + TEXT1.getText(); JOptionPane.showMessageDialog( null, TEXTO, "Saudação para mulher", 1 ); } TEXT1.setText(""); TEXT1.requestFocus(); } } public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); C12EX08 VISUAL = new C12EX08(); VISUAL.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Prof. Walcyr 46 Material de Aulas Java-5 } } ); } } Definição das variáveis do tipo objeto RADIO1 e RADIO2. A variável RADIO1 é instanciada a partir de JRadioButton("Masculino",true), de forma que essa opção, quando apresentada, estará automaticamente selecionada. Prof. Walcyr 47 Material de Aulas Java-5 O código TEXT1.setText(""); faz a limpeza com um branco sobre o componente manipulado pela variável TEXT1. O código TEXT1.requestFocus(); pelo método requestFocus() devolve para o componente o foco (cursor) para a variável TEXT1. Prof. Walcyr 48