JFC/Swing Java Avançado Interface Gráfica JFC/Swing Roberto Vedoato vedoato@joinville.udesc.br Introdução Organização das Aplicações Containers Swing Hierarquia de Componentes Swing Componentes Swing Look-and-Feel Dicas de Ferramentas Mnemônicos de Teclado Caixas de Diálogo Padrão Gerenciadores de Leiaute JFC/Swing 2 Introdução JFC / Swing Introdução JFC / Swing JFC (Java Foundation Classes) é um conjunto capacidades gráficas que facilitam a criação de melhores interfaces em Java Swing é o nome dado à coleção de componentes Swing substitui totalmente componentes AWT. Há componentes Swing correspondentes a cada um dos componentes AWT Componentes Swing são implementados inteiramente em Java AWT era implementada com métodos nativos Características Adição de novos componentes Suporte a Look-and-Feel plugável Recursos de acessibilidade API Java 2D Internacionalização Suporte a drag & drop, cut & paste, undo/redo Mantém e estende a interface de eventos e leiaute É preciso importar java.awt e javax.swing para usar JFC Evite misturar componentes AWT e Swing JFC/Swing 3 JFC/Swing 4
Construindo uma Aplicação Swing Construindo uma Aplicação Swing Importar pacote Swing e awt import javax.swing.*; import java.awt.*; Usar um container de alto nível JFrame frame = new JFrame(); Adicionar componentes ao container intermediário JLabel label = new JLabel( Texto ); getcontentpane().add(label); Redimensionar janela automaticamente para o tamanho e layout dos seus componentes pack(); Tornar janela visível: setvisible(true); import javax.swing.*; import java.awt.*; public class HelloWorldSwing { public static void main(string[] args) { JFrame frame = new JFrame("HelloWorldSwing"); JPanel pane = new JPanel(); JLabel label = new JLabel("Hello World"); pane.add(label); frame.setcontentpane(pane); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.pack(); frame.setvisible(true); } } Ver http://java.sun.com/docs/books/tutorial/uiswing/learn/example1.html JFC/Swing 5 JFC/Swing 6 Organização de aplicações JFC Organização de aplicações JFC Aplicações JFC exigem 3 tipos de componentes Container de alto-nível Provê um lugar para alocar outros componentes Swing Exemplo: JFrame Container intermediário, chamado de painel de conteúdo Onde adicionamos outros containers e componentes Exemplo: JPanel Componente atômico Componente que geralmente implementa algum evento Exemplo: JButton Assim, toda aplicação JFC é uma hierarquia de containers O painel de conteúdo (contentpane) é uma área independente de plataforma que cobre a área útil do JFrame Pode ser manipulado por um objeto da classe Container Container p = getcontentpane(); Podemos especificar o painel de conteúdo JPanel pane = new JPanel(); setcontentpane(pane); Uma vez definido o painel de conteúdo métodos como setlayout (LayoutManager) e add(component) são chamados a partir do painel de conteúdo e não do container de alto nível Recomenda-se que todos componentes atômicos, exceto menus, sejam inseridos em containers intermediários JFC/Swing 7 JFC/Swing 8
Organização de aplicações JFC Containers Swing Containers de Alto nível JApplet JDialog JFrame Containers Intermediários JPanel JScroolPane JSplitPane JTabbedPane JToolBar JMenuBar Containers de Propósito Especial InternalFrame LayeredPane RootPane JFC/Swing 9 JFC/Swing 10 Container de Alto Nível - JFrame Container de Alto Nível - JFrame Um JFrame contém um JRootPane como seu único filho JRootpane é composto de um glasspane, um menubar opcional e um contentpane O glasspane fica sobre todos para interceptar movimentos de mouse O contentpane provido pelo JRootPane contém todos componentes, exceto componentes menu, do JFrame Diferentemente de um Frame AWT, um JFrame tem alguma noção de como responder quando o usuário tenta fechá-lo. O comportamento padrão é escondê-lo. Para alterar o comportamento padrão utilize o método setdefaultcloseoperation(int) Estrutura do JRootPane o qual JFrame contém para gerenciar o contentpane, o menubar assim como o glasspane JFC/Swing 11 JFC/Swing 12
Container de Alto Nível - JFrame Hierarquia de Componentes Swing Exceto containers de alto-nível, todos componentes Swing que começam com a letra J são derivados de javax.swing.jcomponent, que é uma extensão de java.awt.container que por sua vez estende java.awt.component JFC/Swing 13 JFC/Swing 14 Componentes Swing JLabel Alguns dos componentes Swing JButton, JRadioButton, ButtonGroup, JCheckBox JComboBox, JList JLabel, JSlider, JProgressBar JTextField, JTextArea, JPasswordField JScrollPane, JSplitPane, JTabbedPane JToolBar JTree, JTable JColorChooser, JFileChooser JMenuBar, Jmenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem inclusão de ícones alinhamento individual JLabel(String, int) // rótulo de texto, alinhamento Alinhamento: JLabel.{LEFT, CENTER, RIGHT}) JLabel(String, Icon, int) Icone na forma: ImageIcon icone = new ImageIcon("nomeIcone.gif"); JLabel titulo = new JLabel("titulo",icone,JLabel.LEFT); JFC/Swing 15 JFC/Swing 16
JButton JTextField inclusão de ícones JButton(String) JButton(Icon) JButton(String, Icon) método setechochar(char) não é mais suportado, para tal comportamento tem-se o novo componente JPasswordField JTextField(int) JTextField(String,int) // texto, largura JFC/Swing 17 JFC/Swing 18 JCheckBox JRadioButton inclusão de ícones JCheckBox(String) JCheckBox(Icon) JCheckBox(String, boolean) JCheckBox(Icon, boolean) JCheckBox(String, Icon) JCheckBox(String, Icon, boolean) necessidade de declarar a classe ButtonGroup para que apenas um componente possa ser selecionado de cada vez ButtonGroup group = new ButtonGroup(); group.add(birdbutton); classe CheckboxGroup não é mais utilizada JRadioButton(String) JRadioButton(Icon) JRadioButton(String, boolean) JRadioButton(Icon, boolean) JRadioButton(String, Icon) JRadioButton(String, Icon, boolean) JFC/Swing 19 JFC/Swing 20
JComboBox novo nome para classe Choice JComboBox() sem argumento Métodos additem(object) adiciona item à lista seteditable(boolean) false para transformar em lista de escolha e true para transformar em lista com inclusão permitida Look and Feel Um look-and-feel plugável pode ser especificado pelo programador ou selecionado pelo usuário em tempo de execução Classe UIManager possui o método setlookandfeel(lookandfeel) que permite escolher aparência e comportamento de uma aplicação GUI Ver http://java.sun.com/docs/books/tutorial/uiswing/learn/example2.html JFC/Swing 21 JFC/Swing 22 Exemplo de Look and Feel Look and Feel try{ UIManager.setLookAndFeel( "javax.swing.plaf.metal.metallookandfeel"); //UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()); } catch(exception e){ System.out.println("Não pode usar look feel + e);} Argumentos para o método setlookandfeel: UIManager.getCrossPlatformLookAndFeelClassName() Returns the look and feel that works on all platforms the Java look and feel. UIManager.getSystemLookAndFeelClassName() Specifies the look and feel for the current platform. On Microsoft Windows platforms, this specifies the Windows look and feel. On Mac OS platforms, this specifies the Mac OS look and feel. On other Unix platforms, such as Solaris or Linux, this returns the CDE/Motif look and feel. "com.sun.java.swing.plaf.gtk.gtklookandfeel" Specifies the GTK+ look and feel. "javax.swing.plaf.metal.metallookandfeel" Specifies the Java look and feel. (The codename for this look and feel was Metal.) "com.sun.java.swing.plaf.windows.windowslookandfeel" Specifies the Windows look and feel. Currently, you can use this look and feel only on Microsoft Windows systems. "com.sun.java.swing.plaf.motif.motiflookandfeel" Specifies the CDE/Motif look and feel. This look and feel can be used on any platform. JFC/Swing 23 JFC/Swing 24
Dicas de Ferramentas Mnemônicos de Teclado Legendas textuais que aparecem quando o mouse permanece por alguns segundos sobre um componente Tem o tamanho máximo de uma linha Método settooltiptext(string) do componente JTextField cpf = new JTextField(); cpf.settooltiptext( Entre com o CPF sem hífen"); Sequência de teclas que permite usar uma aplicação Java com o teclado Modo de usar mnemônico varia com a plataforma Windows é tecla ALT Método setmenmonic(char) do componente JButton botao = new JButton( Ajuda"); botao.setmnemonic( a'); Pressionar (ALT + a) aciona o componente JFC/Swing 25 JFC/Swing 26 Caixas de Diálogo Padrão Gerenciadores de Leiaute A classe JOptionPane oferece métodos que criam caixas de diálogo padrão showconfirmdialog Caixa de Diálogo do tipo Yes/No/Cancel showinputdialog Caixa de Diálogo do tipo entrada de dados com campo texto showmessagedialog Caixa de Diálogo do tipo mensagem showoptiondialog Caixa de Diálogo do tipo opção que combina recursos das anteriores Podem ser modais (bloquear o programa até ser fechada pelo usuário), via construtor ou método setmodal() Java oferece um esquema simplificado mas muito versátil para controlar o tamanho e a posição de componentes nos containers Há duas formas de acrescentar componentes em um container Usar um Gerenciador de Leiaute (layout manager) para dimensionar e posicionar os componentes (esta é a maneira recomendada e padrão) Desligar o layout manager, posicionar e redimensionar os componentes diretamente (pixels) Ver http://java.sun.com/docs/books/tutorial/uiswing/learn/example6.html JFC/Swing 27 JFC/Swing 28
Gerenciadores de Leiaute FlowLayout Todo container tem um algoritmo de leiaute padrão Método setlayout() define o Gerenciador de Leiaute a ser utilizado FlowLayout BorderLayout GridLayout GridBagLayout CardLayout Null para desligar os layout managers Os componentes são arranjados por linhas, da esquerda para direita na ordem em que são adicionados Exemplo setlayout(new FlowLayout()); JFC/Swing 29 JFC/Swing 30 GridLayout BorderLayout Os componentes são arranjados numa grade retangular onde todas as células possuem o mesmo tamanho de forma que toda a área do container seja ocupada O número de linhas e colunas pode ser especificado, Exemplo setlayout(new GridLayout(2, 2)); Os componentes são arranjados pelos pontos cardeais mais o centro Cada região só pode ser ocupada por um único componente Os componentes são redimensionados de forma a ocuparem toda a região onde foram inseridos JFC/Swing 31 JFC/Swing 32
Combinação de Leiautes Combinação de Leiautes Através de containers intermediários podemos combinar leiautes, adicionando no painel de conteúdo painéis com diferentes leiautes Os componentes de cada painel são tratados como um conjunto Tem-se assim interfaces com leiautes sofisticados Ver http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html Novos algoritmos de layout podem ser criados implementando interface LayoutManager (e LayoutManager2) É impossível controlar tamanho e posição de componentes se um LayoutManager estiver sob controle Para flexibilizar regras de posicionamento, configure o LayoutManager usado através de seus construtores e métodos Para flexibilizar regras de dimensionamento, altere o preferredsize dos componentes Tamanhos preferidos dos componentes setpreferredsize(), disponível em alguns componentes, permite definir o seu tamanho ideal getpreferredsize(), disponível em todos os componentes pode ser sobreposto em subclasses e será chamado pelos Layout Managers que o respeitam (Flow, Border) JFC/Swing 33 JFC/Swing 34 AWT Thread java.awt.graphics Thread que é responsável pela atualização do contexto gráfico Chama update() (método de Component) e passa referência para o contexto gráfico como argumento sempre que for necessário redesenhá-lo. Método update(graphics g) 1. Limpa a área a ser redesenhada (contexto gráfico) 2. Chama paint(g) Métodos update() e paint() nunca devem ser chamados diretamente a partir do thread principal Use repaint(), que faz o agendamento de uma chamada a update() através do AWT thread Sobreponha update() se desejar Representa o contexto gráfico de cada componente Passado pelo sistema quando chama update() Programador pode desenhar no componente usando referência recebida via paint() ao sobrepor o método: public void paint(graphics g) { Graphics2D g2 = (Graphics2D) g; Shape s = new Ellipse2D.Double(); g2.setcolor(color.red); g2.draw(s); } Para definir o que será desenhado em determinado componente, sobreponha seu método paint() Use Graphics2D! Mais recursos! JFC/Swing 35 JFC/Swing 36
Exercício Exercício Interface Sugerida Elabore uma aplicação que simule o cadastro de uma pessoa (cpf, nome, telefone e e-mail). Observe que para tal, teremos a classe Pessoa e duas classes gráficas, Cadastro e Relatório. Para o cadastro do sexo deve ser utilizada uma caixa de escolha (objeto da classe JComboBox). No cadastro deve haver um botão que automaticamente exibe, em uma nova janela, um relatório com os dados digitados pelo usuário. No entanto, caso algum elemento tenha sido deixado em branco, uma mensagem deve ser exibida e a nova janela não poderá ser exibida. Pede-se também que após a janela de resultado ser exibida todos os campos sejam limpos para o cadastro de um novo usuário. JFC/Swing 37 JFC/Swing 38