Baixe Java GUI e JDBC e outras Slides em PDF para Análise de Sistemas de Engenharia, somente na Docsity! Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. Interface Gráfica e Banco de Dados em Java Componentes GUI – Parte II Agosto 2006 Interface Gráfica e Banco de Dados em Java 2 Licença para uso e distribuição Este material está disponível para uso não- comercial e pode ser derivado e/ou distribuído, desde que utilizando uma licença equivalente. Atribuição-Uso Não-Comercial- Compartilhamento pela mesma licença, versão 2.5 http://creativecommons.org/licenses/by-nc-sa/2.5/deed.pt Você pode copiar, distribuir, exibir e executar a obra, além de criar obras derivadas, sob as seguintes condições: (a) você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante; (b) você não pode utilizar esta obra com finalidades comerciais; (c) Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. Agosto 2006 Interface Gráfica e Banco de Dados em Java 5 JSlider: componente deslizante Determina um valor em um intervalo fechado; Instância de javax.swing.JSlider: majorTickSpacing: espaçamento do traço maior; minorTickSpacing: espaçamento do traço menor; minimum e maximum: definem o intervalo; orientation: VERTICAL ou HORIZONTAL; paintLabels: mostra legenda; paintTicks: mostra os traços; snapToTicks: só pode escolher valores marcados por traços. Agosto 2006 Interface Gráfica e Banco de Dados em Java 6 JSlider: detectando mudanças ChangeListener – método stateChanged(); Propriedade value de JSlider: valor atual; Experimente: Crie uma janela com dois painéis: Painel central: construa uma classe que herda de JPanel e desenha um círculo, dado o diâmetro; Painel no rodapé: um JSlider de 0 a 400, com marcas maiores a cada 100 e menores a cada 50; Ao mudar o valor do slider, redesenhar o círculo com o novo diâmetro. Agosto 2006 Interface Gráfica e Banco de Dados em Java 7 JSlider: legenda personalizada Podemos mudar a legenda do slider: Crie uma Hashtable (similar a um HashMap); Adicione pares número x componente. Ex.: Adicione ao slider com setLabelTable(). Hashtable ht = new Hashtable(); // Troca a legenda 100 por “Pequeno”: ht.put(100, new JLabel("Pequeno")); A tabela mapeia números a componentes GUI. Podemos então substituir os números por qualquer widget. Como poderíamos fazer para colocar imagens no rótulo do slider? Agosto 2006 Interface Gráfica e Banco de Dados em Java 10 JFrame: eventos de janela WindowFocusListener: windowGainedFocus(); windowLostFocus(). WindowStateListener: windowStateChanged(). Todos os métodos recebem uma instância de WindowEvent; O adaptador WindowAdapter implementa todas estas interfaces. Agosto 2006 Interface Gráfica e Banco de Dados em Java 11 JFrame: eventos de janela Teste os eventos de janela! Crie uma janela que contenha um rótulo que diga: “Bom dia!” quando a janela é aberta; “Olá de novo!” quando a janela for restaurada; “ZZZ...” quando a janela estiver inativa; “Opa!” quando a janela for reativada. Além disso, use JOptionPane para dizer: “Até logo!” quando a janela for minimizada; “Adeus!” quando a janela for fechada. Agosto 2006 Interface Gráfica e Banco de Dados em Java 12 JFrame: o painel de conteúdo JFrames possuem a propriedade contentPane: painel exibido entre as bordas da janela; Até agora, criamos subclasses de JFrame; A partir de agora, criaremos classes que estendem JPanel e as colocaremos como painel de conteúdo de um JFrame; Justificativa: nosso painel pode ser usado em outros tipos de janela (ex.: janelas internas); Quando o JFrame precisar de configurações extensas (ex.: janela com menus), usaremos as duas abordagens. Agosto 2006 Interface Gráfica e Banco de Dados em Java 15 JMenuBar: propriedades JMenu, JMenuItem e subclasses: text: texto apresentado pelo menu; mnemonic: letra que ativa o menu pelo teclado; icon: ícone do menu; toolTipText: dica de ferramenta (aparece quando o mouse paira sobre o menu / item). Adiciona-se itens e separadores à JMenus pelo método add(); A ordem que são adicionados indica a ordem que aparecerão. Agosto 2006 Interface Gráfica e Banco de Dados em Java 16 Dicas de ferramentas Vimos que menus possuem uma propriedade toolTipText; Tool tip é um texto que aparece quando o mouse paira sobre o componente; Todos os componentes possuem esta mesma propriedade, que pode ser configurada. Agosto 2006 Interface Gráfica e Banco de Dados em Java 17 JPopupMenu: menu pop-up Um menu pop-up aparece quando clicamos com o botão direito em um componente; Funciona como um menu normal; Deve ser exibido usando o método show() – parâmetros: Componente que ativou o pop-up; Posição X e Y onde o menu deve aparecer (relativo ao componente que ativou). ATENÇÃO: menus não podem compartilhar itens (adicionar o mesmo item a dois menus). Agosto 2006 Interface Gráfica e Banco de Dados em Java 20 Look & feel O look & feel (aparência & comportamento, L&F ou LAF) define como serão exibidos os widgets; Componentes Swing possuem LAF plugável, isto é, pode ser alterado em tempo de execução; LAFs do Java SE: Outros podem ser baixados da Internet. L&F Classe SO Metal javax.swing.plaf.metal.MetalLookAndFeel Todos CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel Todos GTK+ com.sun.java.swing.plaf.gtk.GTKLookAndFeel Linux Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel Windows Agosto 2006 Interface Gráfica e Banco de Dados em Java 21 Mudando o LAF // import javax.swing.SwingUtilities; // import javax.swing.UIManager; // Obtém os LAFs instalados: UIManager.LookAndFeelInfo[] lafs; lafs = UIManager.getInstalledLookAndFeels(); // Obtém informações sobre o segundo LAF: String classe = lafs[1].getClassName(); String nome = lafs[1].getName(); // Altera para este LAF: UIManager.setLookAndFeel(classe); SwingUtilities.updateComponentTreeUI(this); Agosto 2006 Interface Gráfica e Banco de Dados em Java 22 Janelas MDI MDI = Multiple Document Interface = Interface de Múltiplos Documentos; Classes JDesktopPane (container) e JInternalFrame (janela) – javax.swing; Permitem a criação de janelas internas: Não aparecem na barra de tarefas; Podem ser maximizadas ou minimizadas dentro da área da janela MDI. Agosto 2006 Interface Gráfica e Banco de Dados em Java 25 JInternalFrame: reposicionando Por padrão, janelas internas abrem todas na posição (0, 0); Podemos mudar sua posição com o método reshape() – parâmetros: Coordenada X; Coordenada Y; Largura; Altura. Agosto 2006 Interface Gráfica e Banco de Dados em Java 26 JInternalFrame: selecionando Algumas vezes a nova janela interna não é selecionada e trazida para frente por padrão; Você pode forçar esta seleção com setSelected(true); Este método pode lançar uma PropertyVetoException, caso a atual janela selecionada se recuse a ceder a vez. Agosto 2006 Interface Gráfica e Banco de Dados em Java 27 JDesktopPane: manipulando janelas Em algumas situações, você pode querer manipular todas as janelas internas; Ex.: colocá-las lado a lado ou em cascata. Para obtê-las, use o método getAllFrames() de JDesktopPane; Experimente: Adicione um menu “Janela” e um item “Em cascata” e disponha todas as janelas internas em cascata. Você precisará saber o estado de uma janela: use isIcon() e setMaximum(). Agosto 2006 Interface Gráfica e Banco de Dados em Java 30 JProgressBar: medindo progresso Barras de progresso medem o andamento de uma tarefa específica; Instância de javax.swing.JProgressBar: minimum: valor mínimo; maximum: valor máximo; value: valor atual da barra; stringPainted: se o percentual é impresso em cima da barra de progresso; orientation: VERTICAL ou HORIZONTAL; string: o que está impresso em cima da barra. Igual ao JSlider! Agosto 2006 Interface Gráfica e Banco de Dados em Java 31 Threads 101 Barras de progresso monitoram atividades que ocupam o processador; A atualização da barra de progresso também ocupa o processador; Precisamos processar estas duas atividades em paralelo. Para isso utilizamos threads; Threads ou “linhas de execução” são implementadas por java.lang.Thread. Agosto 2006 Interface Gráfica e Banco de Dados em Java 32 Threads 101 public class AtividadeSimulada extends Thread { private int minimo; private int maximo; private int valor; public AtividadeSimulada(int minimo, int maximo) { this.minimo = minimo; this.maximo = maximo; } public void run() { valor = minimo; while (valor++ < maximo) { try { sleep(100); } catch (InterruptedException e) { return; } } } Agosto 2006 Interface Gráfica e Banco de Dados em Java 35 JProgressBar com timer e thread // A atividade ainda não foi iniciada. Inicia. if (atividade == null) { atividade = new AtividadeSimulada(0, 400); barraProgresso.setValue(atividade.getValor()); // O timer monitorará a atividade a cada 0,5 seg. timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent e) { // Verifica se já acabou ou foi interrompida. if ((atividade == null) || (! atividade.isAlive())) { timer.stop(); atividade = null; botaoIniciar.setText("Iniciar Simulação"); } else { Agosto 2006 Interface Gráfica e Banco de Dados em Java 36 JProgressBar com timer e thread barraProgresso.setValue(atividade.getValor()); areaTexto.append(atividade.getValor() + "\n"); } } }); atividade.start(); timer.start(); botaoIniciar.setText("Parar Simulação"); } // A atividade já foi iniciada. Interrompe. else { atividade.interrupt(); atividade = null; botaoIniciar.setText("Iniciar Simulação"); } Agosto 2006 Interface Gráfica e Banco de Dados em Java 37 Organizando o visual Algumas ferramentas que temos para organizar o visual de nossas janelas e painéis: Painéis com bordas; Divisórias; Painéis com guias. Agosto 2006 Interface Gráfica e Banco de Dados em Java 40 JSplitPane: experimente... Crie um painel com uma divisória no meio; À esquerda, coloque o painel do JSlider; À direita, coloque um texto de ajuda: Use uma JTextArea, mudando sua cor de fundo para Panel.background; Coloque a área de texto em um JScrollPane, configurando sua borda como “(No border)”. Manipule o componente deslizante na parte inferior da janela para mudar o tamanho da figura desenhada acima dele. Agosto 2006 Interface Gráfica e Banco de Dados em Java 41 JTabbedPane: múltiplas guias Mostra guias (abas, tabs) que permitem múltiplos painéis na mesma janela; Instância de javax.swing.JTabbedPane: addTab() adiciona uma guia: Título, ícone, componente, tooltip. insertTab() insere em uma dada posição: Título, ícone, componente, tooltip, índice. removeTabAt(índice) remove uma guia; setSelectedIndex(índice) seleciona uma guia; tabLayoutPolicy: wrap ou scroll; tabPlacement: TOP, LEFT, RIGHT, BOTTOM. Agosto 2006 Interface Gráfica e Banco de Dados em Java 42 JTabbedPane: detectando mudanças ChangeListener – método stateChanged(); Propriedades selectedIndex e tabCount; Experimente: Crie um painel com 6 guias, colocando em cada uma uma imagem diferente; Experimente diferentes políticas de layout e posicionamentos; Adicione um ouvinte que exiba a mensagem “Esta é a última imagem” sempre que a última imagem for exibida. Agosto 2006 Interface Gráfica e Banco de Dados em Java 45 JEditorPane: experimente! Construa um navegador da Internet! Agosto 2006 Interface Gráfica e Banco de Dados em Java 46 Relembrando GridLayout Divide o painel em células, como uma tabela; Cada célula contém até um componente; Construtor recebe número de linhas e colunas e, opcionalmente, espaçamentos vert. e horiz.; Componentes são dispostos na seqüência de leitura (ex.: [1, 1], [1, 2], [2, 1], [2, 2], ...). Agosto 2006 Interface Gráfica e Banco de Dados em Java 47 Relembrando GridBagLayout Similar ao GridLayout, porém: Colunas e linhas podem ter tamanhos diferentes; Componentes podem ocupar mais de uma célula; Uso de GridBagConstraints para configuração; Muito difícil de usar manualmente, requer IDE.