Programação com Acesso a BD Curso: Técnico em Informática Campus: Ipanguaçu Clayton Maciel Costa [email protected] Programação com Acesso a BD “Há apenas uma pequena distância entre criatividade e insanidade. O que impede as idéias criativas é o demônio crítico da mente que prematuramente as considera impossíveis” M. P. J. 1 Programação com Acesso a BD Unidade VII: Criando Interfaces Gráficas em Java Pacote AWT Pacote utilizado para construir GUIs (Graphical User Interfaces) Classes AWT podem se dividir em: – Componentes – Layouts – Classes Utilitárias 2 Aplic. Standalone x Applets Aplic. Standalone – Método Interessante: main() Applets – Métodos Interessantes: init() start() stop() destroy() Criando Interfaces Gráficas Criar os containers; Adicionar os componentes de interface; Posicionar os componentes (lay out); Adicionar funcionalidade (Manipulação de Eventos). 3 Exemplo - Adicionando um Botão Botão Botão Panel Applet Frame Exemplo import java.awt.*; import java.applet.Applet; public class Exemplo1 extends Applet { Button hiButton; public void init() { hiButton = new Button(“Click Me!”); add(hiButton); } } 4 Exemplo import java.awt.*; public class ExFrame { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrame() { p.add(b); f.add(p); f.setSize(400,200); f.setVisible(true); } public static void main(String argv[]) { new ExFrame(); } } Exemplo Panel 200 400 5 Componentes Elementos de interface apresentados aos usuários. Podem ser programados para reagir a interações com usuários (Manipulação de Eventos) A maioria dos componentes são derivados da classe Component, com exceção da classe MenuComponent. Observação A Classe Component é uma classe abstrata, que define elementos comuns a todos os componentes, como fonte, cor, pintura, forma e manipulação de eventos. Por ser abstrata, não pode ser instanciada. 6 Árvore da Classe Component Component Button Canvas Checkbox Panel Applet Container Label Window Dialog Scrollpane List TextComponent TextArea Scrollbar Choice TextField Frame Java.applet FileDialog Observações Todo item visível do AWT é subclasse de Component. – Isto permite que métodos sejam utilizados da mesma forma para todos os componentes, como, por exemplo, mudar a cor de fundo. Tudo no AWT é direcionado a eventos. – O estilo de programação é, então, nãolinear. Componentes podem ser colocados na página tanto em posição absoluta quanto relativa. 7 Observações Uma classe em um pacote pode ser subclasse de uma superclasse em outro pacote. Por exemplo: – O caso da classe Applet, que pertence ao pacote java.applet, mas é subclasse de Panel, que pertence ao pacote java.awt. Componentes Componentes Simples Componentes de Texto Containers 8 Componentes Simples Button Checkbox Choice List Label List Button Classe: java.awt.Button; Construtor: – Button() – Button(String label) Métodos: – String getLabel() – void setLabel(String label) Exemplo: – Button aButton = new Button(“Ok”); 9 Checkbox Classe: java.awt.Checkbox; Valor Inicial Construtor: Checkbox() Checkbox(String label) Checkbox(String label, boolean s) Checkbox(String label, boolean s, CheckboxGroup g); Métodos Principais: String getLabel() void setLabel(String label) boolean getState() void setState(boolean s) CheckboxGroup getCheckboxGroup() void setCheckboxGroup(CheckboxGroup g) Checkbox (cont.) Exemplo: Checkbox cbCadastrar = new Checkbox(“Show”); cbCadastrar.setState(true); ... if (cbCadastrar.getState()) { cbCadastrar.setLabel(“Show1”); } 10 Checkbox & Radio Button Checkbox – Selecionar mais de um elemento de cada vez – Não necessita de CheckboxGroup Radio Button – Selecionar apenas um elemento de cada vez – Necessita de CheckboxGroup Checkbox & Radio Button Exemplo: Checkbox cbPoupanca = new Checkbox(“Poupanca”); Checkbox cbConta = new Checkbox(“Conta Corrente”); CheckboxGroup chTipoConta = new CheckboxGroup(); cbPoupanca.setCheckboxGroup(chTipoConta); cbConta.setCheckboxGroup(chTipoConta); 11 Choice List Classe: java.awt.Choice; Construtor: Choice() Métodos Principais: void addItem(String item) int getItemCount() void remove(int ind) String getItem(int ind) String getSelectedItem() void select(int ind) Choice List (cont.) Exemplo: Choice chTipoConta = new Choice(); chTipoConta.addItem(“Poupanca”); chTipoConta.addItem(“Conta Normal”); chTipoConta.addItem(“Conta Especial”); chTipoConta.select("Conta Normal"); String tipoConta = chTipoConta.getSelectedItem(); if (tipoConta.equals("Conta Normal")){ Conta c = new ContaNormal(123, null); } 12 Label Classe: java.awt.Label; Construtor: Label() Label(String label) Label(String label, int alin) Métodos: int getAlignment() void setAlignment(int alin) String getText() void setText(String texto) Label Exemplo: Label aLabel = new Label(“Hello”, Label.CENTER); 13 Scrolling List Multiselect Classe: java.awt.List; Construtores: – List(int num, boolean mult) – List() Métodos Principais: Número de Opções – String getItem(int indice) – void addItem(String label) Exemplo: List l = new List(3); l.addItem(“Domingo”); l.addItem(“Segunda”); l.addItem(“Terça”); l.addItem(“Quarta”); Scrolling List (cont.) Valor de Multiselect: – true: Permite a seleção de mais de uma opção ao mesmo tempo. – false: Permite a seleção de apenas uma opção. 14 Componentes de Texto Textfield – Uma linha e n colunas TextArea – n linhas e m colunas TextField Classe: java.awt.TextField; Construtor: TextField() TextField(int cols) TextField(String texto) TextField(String texto, int cols) Métodos: int getColumns() String getText() void setText(String texto) Exemplo: TextField aTf = new TextField(“37”, 4); 15 TextArea Classe: java.awt.TextArea; Construtor: TextArea() TextArea(int lin, int cols) TextArea(String texto) TextArea(String texto, int lin, int cols) Métodos: int getColumns() e int getRows() String getText() void setText(String texto) Exemplo: TextArea aTa = new TextArea(“Ok”, 5, 40); Exemplo TextField tfContad = new TextField(); tfContad.setText(""); String numConta = tfContad.getText(); ... TextArea aTextArea = new TextArea("Ok", 5, 40); aTextArea.setText(""); String numConta = aTextArea.getText(); 16 Container Componente que pode conter outros componentes, inclusive outro container. Principais containers: – Panel – ScrollPane – Window Lembrete A classe Applet é subclasse de Panel, logo um Applet deve ser tratado como um panel Panel Normalmente utilizados para agrupar componentes em uma área específica da tela. Um applet é um tipo especial de Panel com propriedades adicionais relativas às implementações de browsers. 17 ScrollPane Um tipo especial de container. Este componente pode receber um conteúdo até maior do que a área do próprio ScrollPane. Neste caso, barras de rolagem (Scrollbars ) são disponibilizados. Window Esta classe encapsula as janelas de alto nível. A classe Window representa uma janela simples, sem barra de título e sem bordas. Suas subclasses oferecem títulos, ícones e funções de controle, como minimizar, maximizar e fechar. Estas subclasses são: Frame e Dialog. 18 Classe Frame Construtores: – Frame() – Frame(String) Principais métodos: – – – – void add() void setSize() void setTitle(String) setVisible(boolean) Exemplo import java.awt.*; public class ExFrame { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrame() { p.add(b); f.add(p); f.setSize(400,200); f.setVisible(true); } public static void main(String argv[]) { new ExFrame(); } } 19 Exemplo Panel 200 400 Classe Dialog Construtores: – Dialog(Frame, String, boolean) – Dialog(Dialog, String, boolean) Subclasse: – FileDialog Modal Exemplo: Dialog d = new Dialog(f,"Atenção", true); 20 Exemplo Dialog import java.awt.*; public class ExDialogModal { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); java.awt.Dialog d; ExDialogModal() { f.add(p); f.setSize(400,200); f.setVisible(true); d = new Dialog(f,"Aviso",true); b.setBounds(40,70,57,24); d.add(b); Exemplo Dialog d.setLayout(null); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); d.setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300); d.show(); } public static void main(String argv[]) { new ExDialogModal(); } } 21 Exemplo Dialog Classe FileDialog Janela completa para seleção de arquivo e diretório. Construtor: – FileDialog(Frame, String, int) Métodos: – String getFile() – String getDirectory() 22 Exemplo FileDialog import java.awt.*; public class ExDialog { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); FileDialog d; String nome; ExDialog() { p.add(b); f.add(p); f.setSize(400,200); f.setVisible(true); Exemplo FileDialog d = new FileDialog(f,"Abrir Arquivo", FileDialog.LOAD);// (SAVE) d.show(); //d.setVisible(true); nome = d.getFile(); System.out.println(nome); } public static void main(String argv[]) { new ExDialog(); } } 23 Exemplo FileDialog Exemplo - MenuBar MenuBar menuPrinc = new MenuBar(); this.setMenuBar(menuPrinc); Menu cadastro = new Menu("Cadastro"); Menu estoque = new Menu("Estoque"); Menu ajuda = new Menu("Ajuda"); MenuItem segmento = new MenuItem("Segmento"); MenuItem produto = new MenuItem("Produto"); MenuItem estoque1 = new MenuItem("Estoque"); MenuItem fornecedor = new MenuItem("Fornecedor"); MenuItem sair = new MenuItem("Sair"); MenuItem sobre = new MenuItem("Sobre"); 24 Exemplo - MenuBar cadastro.add(estoque1); cadastro.add(fornecedor); cadastro.add(produto); cadastro.add(segmento); ajuda.add(sair); ajuda.add(sobre); menuPrinc.add(cadastro); menuPrinc.add(estoque); menuPrinc.add(ajuda); menuPrinc.setHelpMenu(ajuda); Exemplo - MenuBar import java.awt.*; public class ExFrameMenu { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrameMenu() { MenuBar menuPrinc = new MenuBar(); f.setMenuBar(menuPrinc); Menu cadastro = new Menu("Cadastro"); Menu estoque = new Menu("Estoque"); Menu ajuda = new Menu("Ajuda"); MenuItem segmento = new MenuItem("Segmento"); MenuItem produto = new MenuItem("Produto"); MenuItem estoque1 = new MenuItem("Estoque"); MenuItem fornecedor = new MenuItem("Fornecedor"); MenuItem sair = new MenuItem("Sair"); MenuItem sobre = new MenuItem("Sobre"); 25 Exemplo - MenuBar cadastro.add(estoque1); cadastro.add(fornecedor); cadastro.add(produto); cadastro.add(segmento); ajuda.add(sair); ajuda.add(sobre); menuPrinc.add(cadastro); menuPrinc.add(estoque); menuPrinc.add(ajuda); menuPrinc.setHelpMenu(ajuda); p.add(b); f.add(p); f.setSize(400,200); f.setVisible(true); } Exemplo - MenuBar public static void main(String argv[]) { new ExFrameMenu(); } 26 Exemplo - MenuBar Eventos O que são Eventos. Componentes + Eventos = Interação 27 Manipulação de Eventos Os eventos são gerados e ficam disponíveis para a aplicação ou applet. Eventos são propagados a partir dos componentes para os objetos “listeners”. O objeto “listeners” deve registrar quais eventos interessam à aplicação. Eventos Registrar Listeners addActionListener() actionPerformed() Objeto Listener 28 Modelo de Tratamento de Eventos Modelo de Delegação de Evento Uso de uma escuta de evento no tratamento do evento Processa o evento delegado para o objeto particular Quando um evento ocorrre Componente GUI notifica sua escuta Chama o método que trata o evento escutado Classe AWTEvent AWTEvent ComponentEvent FocusEvent InputEvent KeyEvent WindowEvent MouseEvent 29 Classe AWTEvent Hierarquia das Classes AWT.event java.lang.Object java.util.EventObject ActionEvent ContainerEvent AdjustmentEvent FocusEvent ItemEventl PaintEvent ComponentEvent WindowEvent java.awt.AWTEvent InputEvent KeyEvent MouseEvent Nome da Classe Nome da Interface Classe AWTEvent Interfaces do Pacote AWT.event ActionListener java.lang.Object AdjustmentListener ComponentListener java.util.EventListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener Nome da Classe Nome da Interface TextListener WindowListener 30 Exemplo - ActionListener public class ExFileDialog implements ActionListener { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); FileDialog d; String nome; ExFileDialog() { b.addActionListener(this); p.add(b); f.add(p); f.setSize(400,200); f.setVisible(true); } public static void main(String argv[]) { new ExFileDialog(); } public void actionPerformed(ActionEvent e) { d = new FileDialog(f,"Abrir Arquivo",FileDialog.LOAD); d.setVisible(true); nome = d.getFile(); System.out.println(nome); } } Exemplo - ActionListener public class TestList extends Applet implements ActionListener { Button b; TextArea t; List l; public void init() { b = new Button("Checar"); t = new TextArea(5,10); l = new List(4,false); b.addActionListener(this); l.addItem("Um"); l.addItem("Dois"); l.addItem("Três"); l.addItem("Quatro"); add(b); add(l); add(t); } public void actionPerformed(ActionEvent e) { String buttonCommand = e.getActionCommand(); if (buttonCommand.equals("Checar")) { Object[] ao = l.getSelectedObjects(); for(int i=0;i<=Array.getLength(ao)-1;i++) { t.append(ao[i].toString()+”\n”); } } } } 31 Exemplo - MouseListener public class ExFrame implements MouseListener { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrame() { p.add(b); f.add(p); f.setSize(400,200); p.addMouseListener(this); f.setVisible(true); } public static void main(String argv[]) {new ExFrame();} public void mousePressed(MouseEvent e) { System.out.println(e.toString()); } public void mouseEntered(MouseEvent e) { System.out.println(e.toString()); } public void mouseClicked(MouseEvent e) { System.out.println(e.toString()); } public void mouseReleased(MouseEvent e) { System.out.println(e.toString()); } public void mouseExited(MouseEvent e) { System.out.println(e.toString()); } } Exemplo - MouseMotionListener public class ExFrame3 implements MouseMotionListener { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrame3() { p.add(b); f.add(p); f.setSize(400,200); p.addMouseMotionListener(this); b.addMouseMotionListener(this); f.setVisible(true); } public static void main(String argv[]) { new ExFrame3(); } public void mouseMoved(MouseEvent e) { System.out.println(e.toString()); } public void mouseDragged(MouseEvent e) { System.out.println(e.toString()); } } 32 Exemplo - KeyListener import java.awt.*; import java.awt.event.*; public class ExFrame4 implements KeyListener { Frame f = new Frame("Meu Frame"); Panel p = new Panel(); Button b = new Button("OK"); ExFrame4() { p.add(b); f.add(p); f.setSize(400,200); p.addKeyListener(this); b.addKeyListener(this); f.setVisible(true); } public static void main(String argv[]) { new ExFrame4(); } public void keyReleased(KeyEvent e) { System.out.println(e.toString()); } public void keyPressed(KeyEvent e) { System.out.println(e.toString()); } public void keyTyped(KeyEvent e) { System.out.println(e.toString()); } } Conversão de Tipos double valor = c.saldo(); String valorStr = String.valueOf(valor); ... String valorStr = tfValor.getText(); double valor=Double.valueOf(valorStr).doubleValue(); ... Integer i = new Integer(1); System.out.println(i.toString()); ... String line = “3”; int i = Integer.parseInt(line); ... line = Integer.toString(i); ... Integer valor = Integer.getInteger(line); 33 Eventos de Mouse As interfaces que tratam eventos de mouse são MouseListener e MouseMotionListener public void mousePressed( MouseEvent e ) mouse é pressionado. public void mouseClicked( MouseEvent e) pressionado ou "released" sem mover public void mouseReleased( MouseEvent e) "released" após ser arrastado (dragged). public void mouseEntered( MouseEvent e) entra no componente. public void mouseExited( MouseEvent e) sai do componente. public void mouseDragged( MouseEvent e) pressionado e movido. public void mouseMoved( MouseEvent e) movido sobre o componente Classe Adapter para Eventos de Mouse Muitas das interfaces event-listerner têm vários métodos. Nem sempre é desejável definir todos os métodos da interface. O pacote java.awt.event oferece classes adapter event-listerner. Toda interface com mais de um método tem sua classe adapter correspondente. A classe adapter provê uma implementação default de todos os métodos da interface. 34 Classes Adapter Classe adapter Implementa ComponentAdapter ComponentListener ContainerAdapter ContainerListener FocusAdapter FocusListener MouseAdapter MouseListener MouseMotionAdapter MouseMotionListener KeyAdapter KeyListener WindowAdapter WindowListener Diferença Entre os Botões do Mouse isMetaDown() Este método retorna true quando o usuário clica com o botão direito de um mouse com dois ou três botões. Para simular um click com este botão o usuário pode pressionar Meta e click o mouse. isAltDown() Este método retorna true quando o usuário clica com o botão do centro dou mouse em um mouse de três botões. Para simular um click com este botão o usuário pode pressionar alt e click o mouse. 35 Eventos do Teclado Interface KeyListener define os seguintes métodos public void keyPressed( KeyEvent e ) tecla é pressionada. public void keyReleased( KeyEvent e) tecla liberada "released" public void keyTyped( KeyEvent e) tecla digitada isActionKey() Método para determinar se a tecla do evento é uma tecla de ação. Interfaces Gráficas com Swing Swing 36 Interfaces Gráficas com Swing O pacote AWT que baseia-se na biblioteca gráfica de cada plataforma mostrou-se problemática: – Os componentes tinham diferenças sutis de comportamento – Algumas plataformas não possuíam uma coleção muito boa de componentes gráficos impossibilitando a criação de componentes – Haviam erros na implementação da biblioteca gráfica de diferentes plataformas – “Escreva uma vez, debug em todo lugar!” Interfaces Gráficas com Swing O pacote Swing surgiu numa parceria com a Netscape como alternativa para solucionar esses problemas. No caso da biblioteca Swing os componentes são desenhados em cima de uma janela em branco. Como o desenho e o comportamento são implementados pela própria JVM em cima de “quadros” é possível manter o mesmo comportamento e aparência em todas platafortmas. 37 Interfaces Gráficas com Swing Interfaces Gráficas com Swing A interface Swing apresenta vantagens: – Apresenta um conjunto mais rico e conveniente de elementos para a GUI – Depende muito menos da plataforma subjacente, sendo menos sujeito a erros específicos. – Manutenção do mesmo padrão de interface entre plataformas E desvantagens: – A interface é mais lenta de aparecer – As aplicações Java podem ter aparência diferente das demais aplicações 38 Componentes Swing As classes Swing estão no pacote javax.swing A maior parte dos componentes AWT possuem componentes equivalente Swing com nome iniciado por “J”. – Ex: Button e JButton, Panel e JPanel ... O componente JFrame é um dos poucos em Java que não é desenhado em um quadro, mas usado uma janela equivalente da plataforma subjacente. Componentes Swing Component Container JComponent JButton JScrollbar JComboBox JCheckBox JTextArea Window JTree JPanel JLabel JTable JFileChooser JTextField JList JMenuBar Frame Dialog JFrame JDialog JOptionPane JScrollPane 39 Componentes Swing Componentes Swing Os componentes básicos possuem comportamento análogo aos equivalentes AWT: Swing AWT JPanel Panel JTextField TextField JTextArea TextArea JLabel Label JScrollPane ScrollPane JMenuBar MenuBar 40 Swing top-level containers Possuem um JRootPane onde devem ser inserido todos os componentes Todos os componentes devem ser inseridos no content pane. Exemplo: – frame.getContentPane().add(child); Swing top-level containers: – JFrame e JDialog Swing top-level containers 41 Swing top-level containers Swing Exemplo import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); pack() causes a window to be frame.setVisible(true); sized to fit the preferred size and layouts of its sub-components } } 42 Swing Exemplo import javax.swing.*; public class HelloWorldFrame extends JFrame { public HelloWorldFrame() { super(“HelloWorldSwing”); final JLabel label = new JLabel("Hello World"); getContentPane().add(label); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String[] args) { HelloWorldFrame frame = new HelloWorldFrame(); } } Swing Exemplo Object[] options = {"Yes!", "No, I'll pass", "Well, if I must"}; int n = JOptionPane.showOptionDialog( frame, "Duke is a cartoon mascot. \n" + "Do you still want to cast your vote?", "A Follow-up Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]); 43 Swing Exemplo Button Label Menu Menu bar Text field jdk1.x.y/demo/jfc/SwingApplet jdk1.x.y/demo/jfc/SwingSet2 http://java.sun.com/docs/books/tutorial/uiswing/components/exam ples/index.html#ListDemo Classes do Pacote Swing Component – define métodos que podem ser usados nas suas subclasses (Ex: paint and repaint) Container – coleção de componentes relacionados Quando usado com JFrames, attach componentes para o painel (a Container) Método add JComponent – superclass da maioria dos componentes Swing Muitas das funcionalidades dos componentes são herdadas dessa classe 44 Subclasses de JComponent Aparência e Comportamento uniforme em todas as plataformas Acesso direto aos componentes pelo teclado Teclas de atalho Tratamento de evento comum Se os componentes realizam as mesmas ações Dicas da ferramenta Descrição do componente que aparece quando o mouse fica sobre ele. Principais Componentes Swing Mostra Informações não Editáveis Label Progress Bar Tool Tips 45 Demonstração da JLabel label2.setVerticalTextPosition(SwingConstants.BOTTOM); label2.setHorizontalTextPosition(SwingConstants.CENTER); label2.setHorizontalAlignment( SwingConstants.CENTER ); import java.awt.*; import javax.swing.*; public class JLabelDemo extends Japplet { JLabel label1, label2, label3; Icon icon; Container c; label3 = new JLabel(icon); label3.setToolTipText("Este é o Label 3"); c.add(label1); c.add(label2); c.add(label3); public void init() { c = getContentPane(); c.setLayout( new GridLayout(3,1) ); } } icon = new ImageIcon("middle.gif"); label1 = new JLabel("Este Label tem Texto e Imagem", icon, SwingConstants.LEFT ); label1.setToolTipText("Este é o Label 1"); label2 = new JLabel("Este Label tem Texto embaixo"); label2.setToolTipText("Este é o Label 2"); label2.setIcon(icon); Principais Componentes Swing Controles Básicos List Buttons Menu Combo Box Slider Textfield 46 Demonstração Controles Básicos import java.awt.*; import javax.swing.*; label2 = new JLabel( "Enre com password: "); password = new JPasswordField( "Texto Escondido" public class Swing_Basico extends JApplet { JLabel label1, label2; JTextField text1, text2; JPasswordField password; JButton but1, but2; Icon icon1; Container c; public void init() { c = getContentPane(); c.setLayout ( new FlowLayout() ); icon1 = new ImageIcon("left.gif"); ); but1 = new JButton("Click", icon1); but2 = new JButton("Exit"); c.add(label1); c.add(text1); c.add(label2); c.add(password); c.add(but1); c.add(but2); } } label1 = new JLabel( "Entre com texto: "); text1 = new JTextField( 10 ); Principais Componentes Swing Container de Propósito Geral Panel Split Pane Scroll Pane Tool Bar Tabbed Pane 47 Principais Componentes Swing Dispaly Editável de Informações Formatadas Color Choose Table File Choose TextArea Tree Principais Componentes Swing Container de Alto Nível Applet Caixa de Dialogo Frame 48 Principais Componentes Swing Container de Propósito Especial Internal Frame Layered Pane Root Pane Link JCheckBox e JRadioButton Botões de Estado JToggleButton Subclasses JCheckBox, JRadioButton Tem valores on/off (true/false) Class JCheckBox Texto aparece a direita do checkbox Construtor JCheckBox myBox = new JCheckBox( "Title" ); 49 JCheckBox Quando JCheckBox muda de estado Gera ItemEvent Tratado por um ItemListener, deve definir o método itemStateChanged O handlers é registrado com o método addItemListener Class ItemEvent getStateChange() Returns ItemEvent.SELECTED or ItemEvent.DESELECTED JCheckBox Utilização JTextField Method setText( fontObject ) new Font( name, style_CONSTANT, size ) style_CONSTANT - FONT.PLAIN, BOLD, ITALIC Can add to get combinations Exemplo Use JCheckBox para trocar a fonte do JTextField 50 Exemplo JRadioButton Radio buttons Tem dois estados: selecionado e não selecionado Normalmente utilizado como um grupo Somente um radio button no grupo pode ser selecionado de cada vez Selecionando um força os outros para off – Opções mutuamente exclusivas ButtonGroup – mantém o relacionamento lógico entre os botões Classe JRadioButton Construtor JRadioButton( "Label", selected ) If selected true, JRadioButton initially selected 51 JRadioButton Classe JRadioButton Gera ItemEvents (como JCheckBox) Classe ButtonGroup ButtonGroup myGroup = new ButtonGroup(); Interliga radio buttons em relacionamentos lógicos Método add Associa um radio button com um grupo myGroup.add( myRadioButton ) Exemplo 52 JComboBox Combo box (drop down list) Lista de itens, usuário faz uma seleção Classe JComboBox Gera ItemEvents JComboBox Construtor JComboBox ( arrayOfNames ) Índice numérico recupera os elementos Primeiro elemento é adicionado no índice 0 Primeiro ítem adicionado aparece como ítem previamente selecionado JComboBox Métodos de JComboBox getSelectedIndex() Retorna o índice do item selecionado myComboBox.getSelectedIndex() setMaximumRowCount( n ) Seta o número máximo de elementos para mostrar quando o usuário click na combo box Scrollbar é automaticamente inserida setMaximumRowCount( 3 ) Exemplo Use JComboBox para setar um Icon para um JLabel 53 JList List Mostra uma série de itens, pode selecionar um ou mais Classe JList Construtor JList( arrayOfNames ) array de Objetos (Strings) é mostrado na lista setVisibleRowCount( n ) Mostra n itens de cada vez Não insere automaticamente scrolling JList Objeto JScrollPane usado para scrolling 40 c.add( new JScrollPane( colorList ) ); Takes component to which to add scrolling as argument Adiciona um objeto JScrollPane para content pane Métodos JList setSelectionMode( selection_CONSTANT ) SINGLE_SELECTION Um item selecionado de cada vez SINGLE_INTERVAL_SELECTION Lista de seleção múltipla, permite itens contínuos serem selecionados MULTIPLE_INTERVAL_SELECTION Lista de seleção múltipla, qualquer item pode ser selecionado 54 JList Métodos JList getSelectedIndex() Retorna o índice do ítem selecionado Event handlers Implementa interface ListSelectionListener (javax.swing.event) Define método valueChanged() Registre handler com addListSelectionListener Exemplo Use uma JList para selecionar a cor de background Exemplo 55 Listas com Múltiplas Seleções Listas com Mútiplas seleções SINGLE_INTERVAL_SELECTION Seleciona um grupo de ítens contínuos mantendo a tecla Shift pressionada MULTIPLE_INTERVAL_SELECTION Seleciona qualquer quantidade de ítens Pressione a tecla Ctrl e click cada item selecionado Métodos de JList getSelectedValues() Retorna um array de Objetos representando os itens selecionados setListData( arrayOfObjects ) Seta itens de JList para elementos no arrayOfObjects Listas com Múltiplas Seleções Métodos de JList – setFixedCellHeight( height ) • Especifica a altura em pixels de cada item na JList – setFixedCellWidth( width ) • Como acima, especifica a largura da lista Exemplo – Tem duas listas de múltiplas seleções – Botão Copy copia itens selecionados na primeira lista para outra 56 Exemplo JTree Implementa uma visão de uma árvore. Utiliza o modelo TreeModel – – – – – – Object getChild(Object parent, int index) int getChildCount(Object parent) int getIndexOfChild(Object parent, Object child) Object getRoot() boolean isLeaf(Object node) void valueForPathChanged(TreePath path, Object newValue) A implementação default de TreeModel é DefaultTreeModel 57 JTree JTable Implementa a visão de uma tabela Utiliza o modelo TableModel: int getColumnCount() String getColumnName(int columnIndex) int getRowCount() Object getValueAt(int rowIndex, int columnIndex) boolean isCellEditable(int rowIndex, int columnIndex) – void setValueAt(Object aValue, int rowIndex, int columnIndex) – – – – – A implementação default de TableModel é DefaultTableModel 58 JTable JFileChooser Implementa um mecanismo de para selecionar um arquivo: JFileChooser chooser = new JFileChooser(); ExampleFileFilter filter = new ExampleFileFilter(); filter.addExtension("jpg"); filter.addExtension("gif"); filter.setDescription("JPG & GIF Images"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(parent); if(returnVal == JFileChooser.APPROVE_OPTION) { System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName()); } 59 JFileChooser Um filtro de arquivo deve implementar a classe abstrata FileFilter: – abstract boolean accept(File f) – abstract String getDescription() Gerenciadores de Layout Organizam os componentes GUI num container. FlowLayout Padrão para java.awt.Applet, java.awt.Panel e javax.swing.JPanel. Coloca os componentes (da direita para esquerda) na ordem que foram adicionados. BorderLayout Padrão para paineis de conteúdo de Jframes (e outras janelas) e JApplets. Organiza os componentes em cinco áreas: Norte, Sul, Leste, Oeste e Centro. GridLayout Organiza os componentes nas linhas e colunas 60 Exemplos BorderLayout FlowLayout GridLayout Painéis GUIs Complexas É necessário que cada componente seja colocado numa localização exata Podemos usar vários painéis Cada painel de componente pode ter um gerenciamento de layout específico Painéis Classe JPanel herda de JComponent, que herda de java.awt.Container Cada JPanel é um Container JPanels pode ter componentes (e outros JPanels) adicionados a ele JPanel define o tamanho para os componentes nele contido Cresce para acomodar componentes quando eles são adicionados 61 Painéis Como usar Crie painéis, e defina o layout para cada um Adicione componentes para os painéis Adicione os painéis ao content pane (default BorderLayout) Bordas O modelo swing proporciona um modelo de bordas para os componentes que herdam e JComponent. Para isso pode-se utilizar a classe BorderFactory para criar uma borda. TitledBorder titledBorder1 = new TitledBorder("Cores"); jPanel1.setBorder(titledBorder1); 62 Bordas Modelos de componentes A API Swing busca implementar o padrão de projeto Model-View-Control. Para isso, em alguns componentes existe uma interface e uma implementação default do modelo. O usuário pode criar seu próprio modelo ou compartilhar o mesmo modelo com vários componentes de interface. 63 AbstractButton As classes que estendem de AbstractButton usam como modelo um ButtonModel – setModel(ButtonModel) A classe DefaultButtonModel é a implementação default do modelo de um botão. – – – – – – boolean isArmed() boolean isEnabled() boolean isPressed() boolean isSelected() void addActionListener(ActionListener l) void fireActionPerformed(ActionEvent e) Usado em JButton, JCheckBox e JRadioButton Buttons 64 Menus JMenuBar Outros Componentes Border Interface JColorChooser JApplet ImageIcon JInternalFrame JDialog JFileChooser 65 Outros Componentes JLabel JList JScrollPane JOptionPane JSplitPane JScrollBar JSlider JTabbedPane Outros Componentes JTable JTextArea JTextField JToolBar JToolTip JTree 66 Architecture Goals: – entirely on Java – pluggable L&F – model-driven programming – JavaBeans – compability with AWT Use MVC? – Model represents the data – View as a visual representation of the data – Controller takes input and translates it to changes in data The UI Delegate No reason to separate controller and view A separate UI object for defining the visual representation and controller behaviour the UI delegate 67 Models Data-centric applications Separate model interface for every component – GUI-state models • up-down state in JButton and subclasses – application data models • selection state in JToggleButton and subclasses Application programmer can implement his/her own data models for existing components Shared model definitions Model Separation JSlider uses BoundedRangeModel – public JSlider(int orientation, int min, int max, int value) { checkOrientation(orientation); this.orientation = orientation; this.model = new DefaultBoundedRangeModel(value, 0, min, max); this.model.addChangeListener(changeListener); updateUI(); } Calling setModel, application can replace the default – JSlider slider = new JSlider(); BoundedRangeModel myModel = new DefaultBoundedRangeModel() { public void setValue(int n) { System.out.println("SetValue: "+ n); super.setValue(n); } }); slider.setModel(myModel); 68 Change Notification Models implement methods for adding and removing listeners Lightweight notification – only notify – listener queries about the changes – e.g. scrollabar dragged Stateful notification – event described the change – for complex data models – e.g. changes in the column of table Lightweight Notification ChangeListener with one single method – public void stateChanged(ChangeEvent e); Listening to JSlider – JSlider slider = new JSlider(); BoundedRangeModel model = slider.getModel(); model.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { // need to query the model to get updated value... BoundedRangeModel m = (BoundedRangeModel)e.getSource(); System.out.println("model changed: " + m.getValue()); } }); 69 Stateful Notification Tracking JList selection – String items[] = {"One", "Two", "Three"); JList list = new JList(items); ListSelectionModel sModel = list.getSelectionModel(); sModel.addListSelectionListener (new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { // get change information directly // // from the event instance... if (!e.getValueIsAdjusting()) { System.out.println("selection changed: " + e.getFirstIndex()); } } Ignoring Models Most components provide API to the model directly E.g. JSlider’s method – public int getValue() { return getModel().getValue(); } Program can simply do the following – JSlider slider = new JSlider(); int value = slider.getValue(); So, where’s the “model,” anyway! 70 Setting Look & Feel To set a particular L&F (here CDE/Motif), write – UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel” ); To set the appropriate L&F, whatever the current environment, write – UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); Do the above preferably at the end of the program (before instantiating any components) The Swing Packages The Accessibility package (javax.accessibility) – provides support for supporting the screen access products for people with disabilities – Swing has full support for accessibility javax.swing – contains nearly all of the Swing components – notable exception is JTextComponent (in javax.swing.text) javax.swing.border – in need for customized borders, take a look javax.swing.event – includes the additional event classes (not found in java.awt.event) 71 The Swing Packages javax.swing.plaf – classes for providing the L&F capabilities – also javax.swing.plaf.basic including the default L&F classes – the current specialized L&F:s • javax.swing.plaf.metal • javax.swing.plaf.motif (or com.sun.java.swing.plaf.motif) • javax.swing.plaf.windows (or com.sun.java.swing.plaf.windows) – also javax.swing.plaf.multi for mixing multiple L&F:s javax.swing.table – including support classes for managing tables javax.swing.tree – support classes for managing trees The Swing Packages javax.swing.text – support classes for text editing – Document classes – JTextComponent (superclass for all text components) – see also separate format packages • javax.swing.text.html • javax.swing.text.rtf javax.swing.undo – classes for supporting undo/redo operations 72 Ferramentas Visuais Exercício Criar uma Interface Gráfica para a classe Banco, gerando um Applet. Implementar a geração e o tratamento de eventos para esta interface. 73