Componentes da Interface Gráfica Deitel & Deitel – Cap. 12 Roberto C. S. Pacheco Ricardo N. Rieke [email protected] [email protected] Professor Monitor Interface Gráfica A interface gráfica com o usuário (GUI – Graphical User Interface) fornece um conjunto de componentes facilitando primeiramente a utilização de determinada aplicação; O browser é um exemplo de GUI. Na janela, há uma barra de menus que contém itens de menus específicos oferecendo funcionalidades aos usuários; As GUIs são construídas a partir de componentes GUI; Um componente GUI é um objeto com o qual o usuário interage através do mouse, do teclado ou de outra forma de entrada, como o reconhecimento de voz; Alguns componentes do Java podem ser vistos na tabela a seguir: Interface Gráfica Componente JLabel JTextField JButton JCheckBox JComboBox JList JPanel Descrição Área em que podem ser exibidos texto não-editável. Área em que o usuário insere dados pelo teclado. Também podem exibir informações. Área em que aciona um evento quando o mouse é pressionado. Componentes GUI que tem dois estados: selecionado ou não selecionado Lista de itens a partir do qual o usuário pode fazer uma seleção clicando em um item da lista. Área em que uma lista de itens é exibida, a partir da qual o usuário pode fazer uma seleção clicando uma vez em qualquer elemento da lista. Container em que os componentes podem ser adicionados. Interface Gráfica - Swing As classes que criam os componentes GUI (vistos na tabela anterior) fazem parte dos componentes GUI Swing do pacote javax.swing; Esses componentes GUI se tornaram padrão em Java a partir da versão 1.2 da plataforma Java; A maior parte dos componentes Swing são escritos, manipulados e exibidos completamente em Java; Isso permite ao Swing manter uma aparência e um comportamento uniforme em todas as plataformas; Os componentes GUI originais do pacote Abstract Window Toolkit java.awt (também chamado AWT) estão diretamente associados com os recursos da interface gráfica da plataforma local. Assim, seu comportamento depende do ambiente onde são executados (no Windows, a interface se assemelha a aplicações Windows, no Apple a Mac e assim por diante); Interface Gráfica - Swing Para utilizar efetivamente os componentes GUI, as hierarquias de herança javax.swing e do java.awt devem ser compreendidas – especificamente a classe Component, a classe Container e a classe JComponent, que definem os recursos comuns à maioria dos componentes Swing. A classe JComponent é a superclasse para a maioria dos componentes Swing. Essa classe define os atributos e comportamentos comuns para todas as subclasses de JComponent. java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent O Container é uma coleção de componentes. Em aplicativos com JFrame (e em applets), anexam-se os componentes ao painel de conteúdo, que é objeto da classe Container. Essa define os atributos e comportamentos para todas as suas subclasses (ex: método add() – adiciona componentes e método setLayout() – gerencia leiautes.) Interface Gráfica - Swing Os componentes Swing têm muitos recursos, incluindo: Uma aparência e um comportamento plugável, que podem ser utilizados para personalizar um componente; Teclas de atalho (ou teclas mnemônicas), que dão acesso direto a componentes GUI por teclado; Capacidades comuns de tratamento de eventos, para o caso em que vários componentes GUI iniciam as mesmas ações em um programa; Breves descrições da finalidade de um componente GUI (dicas de ferramenta) que são exibidas quando o cursor do mouse é posicionado sobre o componente por um breve instante; Suporte a tecnologias de auxílio ao deficiente físico, como leitores de tela em braile para pessoas cegas; Suporte para exibir em diferentes idiomas. Interface Gráfica - Swing De um modo geral para que um componente tenha comportamento quando este sofrer determinado evento os passos abaixo devem ser seguidos: 1. 2. 3. 4. 5. Criação de uma classe que estenda de JFrame ou JApplet; Criação do componente visual; Adição desse componente para um container; Criação de uma classe interna (tratador de eventos) que implemente determinado listener; Registro do tratador de eventos ao listener através dos métodos disponíveis nas instâncias dos componentes GUI. Obs: Para os componentes que não possuem eventos associados, somente os três primeiros passos são aplicáveis (ex: JLabel). Swing - JLabel Os rótulos fornecem instruções de texto ou informações em um GUI; Os rótulos são definidos com a classe JLabel (uma subclasse de JComponent); O rótulo exibe uma única linha de texto somente de leitura, uma imagem, ou ambos; Os programas raramente alteram o conteúdo do rótulo, após sua criação; Swing – JLabel - Exemplo Exemplo: Solução: desenvolver um aplicativo Java que apresente um label no rodapé de uma tela, colocando um ícone no centro da tela, associado a uma figura de sua escolha e indicando uma frase de dica para o usuário, que aparecerá quando o mouse repousar sobre a figura. 1. Criar uma classe pública (ex: LabelTeste) estendendo JFrame e contendo um objeto de JLabel (para guardar o label) e um objeto de Icon (para guardar o ícone com sua figura) 2. No construtor de objetos da sua classe pública invoque a superclasse JFrame (com o comando super(“texto com o título do frame”), passando como parâmetro o título da tela que criará. 3. No construtor crie uma instância da classe Container para configurar a GUI. Ajuste o objeto de Container para o layout FlowLayout 4. Inicialize o objeto de JLabel com setText (colocando seu texto), setIcon (colocando sua figura), setHorizontalTextPosition e setVerticalTextPosition para colocar no centro e no rodapé, respectivamente e setToolTipText para colocar a dica. 5. Adicione o objeto de JLabel à instância de Container e ajuste o tamanho (setSize) e a visibilidade da janela que será criada (com setVisible) 6. Na função main() crie uma instância de sua classe, chame o construtor e encerre o programa com o método setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE). JLabel - Exemplo 1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 public class LabelTeste extends JFrame { 5 private JLabel label; 6 private Icon icone = new ImageIcon( “java.jpg" ); 7 // Configurando a GUI 8 public LabelTeste() { 9 super( "Testando JLabel" ); 10 // Cria um container e define o modelo de layout (FlowLayout) 11 Container container = getContentPane(); 12 container.setLayout( new FlowLayout() ); 14 // JLabel sem argumentos no construtor 15 label = new JLabel(); 16 label.setText("Label com ícone e texto com alinhamento de rodapé \"bottom\"" ); 17 label.setIcon( icone ); 18 label.setHorizontalTextPosition( SwingConstants.CENTER ); 19 label.setVerticalTextPosition( SwingConstants.BOTTOM ); 20 label.setToolTipText("Este é o label" ); 21 container.add( label ); 22 setSize( 360, 150 ); 23 setVisible( true ); 24 } 25 // Método principal da aplicação 26 public static void main( String args[] ) { 27 LabelTeste application = new LabelTeste(); 28 application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 29 } 30 } // final da clase JLabel – Explicando o Exemplo Linhas 5 e 6 private JLabel label; private Icon icone = new ImageIcon( “java.jpg" ); São criados os objetos label (instância de JLabel) e o objeto icone (instância de Icon). A classe Icon permite definir um ícone que poderá ser associado a vários componentes Swing. Linha 9 super( "Testando JLabel" ); : A palavra reservada super indica a classe pai. Através dessa palavra pode-se acessar atributos (quando públicos), métodos e construtores. Nesse exemplo, como a classe está derivando de JFrame, super(String) é uma chamada ao construtor da classe JFrame para redefinir o título que irá aparecer na janela. Linha 11 e 12 Container container = getContentPane(); container.setLayout( new FlowLayout() ); Cria um container para adicionar os componentes Swing e define o Layout. Existem vários modelos de Layout que serão discutidos na seção sobre Layout. JLabel – Explicando o Exemplo Linhas 15, 16 e 17 label = new JLabel(); label.setText("Label com ícone label.setIcon( icone ); e texto com alinhamento de rodapé \"bottom\"" ); O objeto label é instanciado através do comando new e logo em seguida é utilizado os método setText(String) para atribuir o conteúdo do label e setIcon(Icon) para atribuir o ícone ao label. Linhas 18 e 19 label.setHorizontalTextPosition( SwingConstants.CENTER ); label.setVerticalTextPosition( SwingConstants.BOTTOM ); Utiliza esses métodos para definir os alinhamentos horizontal (setHorizontalTextPosition(int)) e vertical (setVerticalTextPosition(int)). Nesse caso o texto será centralizado horizontalmente e na parte inferior. Utiliza para isso as constantes definidas SwingConstants.CENTER e SwingConstants.BOTTOM. Linhas 20 e 21 label.setToolTipText("Este é o label" ); container.add( label ); O método setToolTipText(String) permite definir o texto que irá aparecer quando o mouse for posicionado sobre o label. Em seguida o label é adicionado para o container. JLabel – Explicando o Exemplo Linhas 22 e 23 setSize( 360, 150 ); setVisible( true ); O método setSize(int, int) permite definir o tamanho do frame (que será o tamanho da janela) e setVisible(boolean) permite definir se o frame deve ou não aparecer. O default é false. Linhas 28 application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); O método setDefaultCloseOperation(int) do objeto global “application” permite definir uma forma de finalizar a aplicação quando se seleciona o ícone superior direito (x). Caso esse método não seja chamado a janela poderá ser fechada mas a aplicação continua na memória. IMPORTANTE: note que até agora utilizamos System.exit(0) para finalizar um programa. Nesse exemplo, a utilização dessa abordagem finalizaria a aplicação logo após a janela ser apresentada. Portanto, torna-se necessária a definição de determinada operação ao evento de clicar no ícone para fechamento da janela. Swing – JLabel - Exercício Exercício: desenvolver um aplicativo Java que apresente um label no topo (“TOP”) de uma tela, colocando um ícone no rodapé da tela, associado a uma figura de sua escolha e indicando uma frase de dica para o usuário, que aparecerá quando o mouse repousar sobre a figura. Tratamento de Eventos Eventos são mapeamentos da interação do usuário com o programa. Essas interações permitem saber que ações o usuário realizou com os periféricos do computador (mouse, teclado, etc.), que interferem no programa. O Objeto JLabel não possui eventos; As GUIs são baseados em eventos, isto é, geram eventos quando o usuário interage com a interface; Algumas interações são: mover o mouse, clicar no mouse, clicar em um botão, digitar um campo de texto, selecionar um item de menu, fechar uma janela, etc; Os eventos da GUI são enviados para o programa quando ocorre uma interação com o usuário; O mecanismo de tratamento de eventos possui três partes: A origem do evento. O objeto do evento. O “ouvinte” (listener) do evento. Tratamento de Eventos A origem do evento é o componente GUI com o qual o usuário interage; O objeto evento encapsula as informações sobre o evento que ocorreu. As informações incluem uma referência para a origem do evento e quaisquer informações específicas que possam ser requeridas pelo listener; O listener recebe notificações de que um evento ocorreu permitindo que este realize determinada ação; O programador precisa executar duas tarefas para processar um evento da GUI com o usuário em um programa: registrar um listener para determinado componente GUI; Implementar um método de tratamento de evento, também chamados de tratadores de eventos. Tratamento de Eventos Modelo de Classes de Eventos do pacote java.awt.event java.lang.Object java.util.EventObject ActionEvent ContainerEvent AdjustmentEvent FocusEvent ItemEvent PaintEvent ComponentEvent WindowEvent java.awt.AWTEvent InputEvent KeyEvent MouseEvent Tratamento de Eventos Interfaces listeners de eventos do pacote java.awt.event ActionListener Java.util.EventListener O objeto listener de eventos “espera por” tipos específicos de eventos (normalmente componentes GUI) em um programa. O tratador de eventos é um método chamado para responder a um tipo de evento em particular. Cada interface listener de eventos especifica um ou mais métodos de tratamento de evento que devem ser definidos na classe que implementa a interface listener de eventos. As interfaces definem métodos abstratos, o que faz com que uma classe que implementa uma interface tenha que definir TODOS os seus métodos, para que possa criar instâncias (caso contrário, a classe fica abstrata). Quando ocorre um evento, o componente GUI com o qual o usuário interagiu notifica os ouvintes registrados no programa, chamando um método de tratamento de eventos apropriado a cada ouvinte. AdjustmentListener ComponentListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener Tabela de Tratamento de Eventos Origem Evento Listener JTextField JPasswordField Jbutton ActionEvent ActionListener JCheckBox JRadioButton ItemEvent ItemListener itemStateChanged(ItemEvent e) JList ListSectionEvent ListSelectionListener actionPerformed(ActionEvent e) valueChanged(ListSelectionEve nt e) Subclasses de java.awt.Compone nt MouseEvent MouseListener mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) Subclasses de java.awt.Compone nt MouseMotionEvent MouseMotionListener mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) Tabela de Tratamento de Eventos Origem Evento Listener Subclasses de java.awt.window WindowEvent WindowListener windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) Subclasses de java.awt.Compon ent FocusEvent FocusListener focusGained(FocusEvent e) focusLost(FocusEvent e) JScrollBar AdjustmentEven t AdjustmentListener adjustmentValueChanged( AdjustmentEvent e) JMenu MenuEvent MenuListener menuCanceled(MenuEvent e) menuDeselected(MenuEvent e) Swing - JButton O botão é um componente em que o usuário clica para disparar uma ação específica. O programa Java pode utilizar vários tipos de botões, incluindo botões de comando, caixas de marcação, botões de alternância e botões de opção. javax.swing.JComponent javax.swing.AbstracButton Javax.swing.JButton Javax.swing.ToggleButton Javax.swing.JCheckBox Javax.swing.JRadioButton Todos os tipos de botão são subclasses de AbstractButton (pacote javax.swing), que define muitos dos recursos comuns aos botões do Swing. Swing – JButton - Exemplo Exemplo: desenvolver um aplicativo Java que apresente um botão associado a um ícone (com figura de sua escolha) e indicando uma frase de dica para o usuário (ex: “pressione o botão”), um botão de finalização do programa e um mecanismo de tratamento do evento associado ao botão com o ícone (onde o tratamento seja apresentar uma nova tela, com uma mensagem). Solução: 1. Criar uma classe pública (ex: ExemploButton) estendendo JFrame e contendo dois objetos de JButton (um para cada botão) e um objeto de Icon (para guardar o ícone com sua figura) e dois objetos String (textos dos botões). 2. No construtor de objetos da sua classe pública invoque a superclasse JFrame, crie uma instância da classe Container para configurar a GUI e use o layout FlowLayout 3. Ainda no construtor crie os botões com o new JButton() passando texto e ícone (para o primeiro) e apenas o texto (para o segundo). 4. Crie o primeiro botão com o new JButton() passando texto e ícone, utilize setIcon(), para colocar o ícone no botão, setToolTipText() para colocar a dica e setActionCommand() para associar a ação do tratamento de eventos. Adicione o botão ao objeto de Container criado no construtor. 5. Crie o segundo botão com o new JButton() passando texto e setToolTipText() para colocar a dica do segundo botão. Adicione o botão ao objeto de Container criado no construtor. 6. Após criar os botões, crie um objeto da classe GerenciadorBotoes. Essa instância será capaz de tratar os eventos associados aos botões. Adicione esse objeto aos listeners dos eventos (addActionListener()) 7. Implemente a classe privada GerenciadorBotoes, que deve implementar a classe abstrata ActionListeners com o tratamento dos eventos associados aos botões. Para isso, implemente os métodos getActionCommand() para cada botão. JButton - Exemplo 1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 5 public class ExemploButton extends JFrame { 6 7 private JButton botao1, botao2; 8 private Icon cafe = new ImageIcon( “java.jpg" ); 9 private String strIcone = "botão associado a uma imagem"; 10 private String strFinalizar = "Finalizar"; 11 12 // Configura a GUI 13 public ExemploButton() { 14 super( "Testando Botões" ); 15 16 // Cria o container e atribui o layout 17 Container container = getContentPane(); 18 container.setLayout( new FlowLayout() ); 19 20 // Cria os botões 21 botao1 = new JButton( “Botão Java”, cafe ); 22 botao1.setIcon(cafe); 23 botao1.setToolTipText("Pressione o botão"); 24 25 container.add( botao1 ); 26 botao2 = new JButton( strFinalizar ); 27 botao2.setToolTipText("Finaliza o programa"); 28 container.add( botao2 ); .... JButton - Exemplo .... 29 // Cria o objeto gestorBotoes (instância da classe interna ButtonHandler) 30 // para o uso no tratamento de eventos de botão 31 GerenciadorBotoes gestorBotoes = new GerenciadorBotoes(); 32 botao1.addActionListener( gestorBotoes ); 33 botao2.addActionListener( gestorBotoes ); 34 35 setSize( 360, 150 ); 36 setVisible( true ); 37 } 38 39 // Classe interna para tratamento de evento de botão 40 private class GerenciadorBotoes implements ActionListener { 41 // Método de manipulação do evento 42 public void actionPerformed( ActionEvent event ) { 43 //Testa se o botão com a imagem foi pressionado 44 if (event.getSource() == botao1) 45 JOptionPane.showMessageDialog( null, 46 "Você pressionou um botão com imagem"); 47 //Testa se o botão "Finalizar" foi pressionado 48 else if (event.getSource() == botao2) 49 System.exit(0); 50 } 51 } // fim da classe interna GerenciadorBotoes 52 53 // Método principal 54 public static void main(String args[]) { 55 ExemploButton application = new ExemploButton(); 56 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 57 } 58 59 } // fim da classe ExemploButton JButton – Explicando o Exemplo Linhas 7 e 10 private JButton botao1, botao2; private Icon cafe = new ImageIcon( “java.jpg" ); private String strIcone = "botão associado a uma imagem"; private String strFinalizar = "Finalizar"; São criados os objetos botao1 e botao2 (instância de JButton) , o objeto cafe (instância de Icon) e duas strings. A classe Icon permite definir um ícone que poderá ser associado a vários componentes Swing. Linha 14 super( "Testando Botões" ); A palavra reservada super indica a classe pai. Através dessa palavra pode-se acessar atributos (quando públicos), métodos e construtores. Nesse exemplo, como a classe está derivando de JFrame, super(String) é uma chamada ao construtor da classe JFrame para redefinir o título que irá aparecer na janela. Linha 17 e 18 Container container = getContentPane(); container.setLayout( new FlowLayout() ); Cria um container para adicionar os componentes Swing e define o Layout. Existem vários modelos de Layout que serão discutidos na seção sobre Layout. JButton – Explicando o Exemplo Linhas 21 até 28 botao1 = new JButton( “Botão Java”, cafe ); botao1.setIcon(cafe); botao1.setToolTipText("Pressione o botão"); container.add( botao1 ); botao2 = new JButton( strFinalizar ); botao2.setToolTipText("Finaliza o programa"); container.add( botao2 ); Os objetos botao1 e botao2 são criados nas linhas 21 e 26. No primeiro utiliza-se o construtor onde é informado o texto e o ícone (objeto “cafe”). Através do método setToolTipText(String) é definida a dica irá aparecer quando o mouse é passado sobre o botão. Cada botão para se tornar visível tem que ser adicionado para um determinado container. Linhas 31 até 33 GerenciadorBotoes gestorBotoes = new GerenciadorBotoes(); botao1.addActionListener( gestorBotoes ); botao2.addActionListener( gestorBotoes ); Cria o objeto gestorBotoes (instância da classe interna GerenciadorBotoes) responsável por tratar o evento do click sobre os botões e adiciona esse listerner através do método addActionListener(ActionListener). JButton – Explicando o Exemplo Linhas 40 até 51 private class GerenciadorBotoes implements ActionListener { // Método de manipulação do evento public void actionPerformed( ActionEvent event ) { //Testa se o botão com a imagem foi pressionado if (event.getSource() == botao1) JOptionPane.showMessageDialog( null, "Você pressionou um com imagem"); //Testa se o botão "Finalizar" foi pressionado else if (event.getSource() == botao2) System.exit(0); } } // fim da classe interna GerenciadorBotoes Interface: especificação de atributos e métodos que devem ser implementados por uma determinada classe. Todos os métodos definidos na interface devem ser implementados na classe, ou seja, se forem especificados dois métodos na interface a classe que implementar a interface deve ter esses mesmos métodos. A classe interna (esta classe está definida dentro de outra classe) GerenciadorBotoes é uma classe que implementa uma interface (definição) ActionListener. Nessa interface existe definido somente o método actionPerformed. Tratamento de Eventos – Como funciona botao1 gestorBotoes Objeto de JButton. Ele contém uma variável de instância do tipo EventListenerList chamada listenerList, que herdou da classe JComponent. listenerList Esse objeto GerenciadorBotoes implementa ActionListener e define o método actionPerformed(). public void acionPerformed(Action event) { // evento tratado aqui } Referência criada pela instrução Botao1.addAcionListener(gestorBotoes) Tratamento de Eventos – Como funciona Como o tratador de eventos foi registrado? Resposta: o registro se deu nos comandos: botao1.addActionListener( gestorBotoes ); botao2.addActionListener( gestorBotoes ); Eles adicionaram o handler de Button (gestorBotoes) como sendo um listener para os objetos botao1 e botao2. Como o componente GUI sabe que deve chamar actionPerformed() em vez de outro método de tratamento de eventos? Resposta: Cada JComponent suporta vários tipos de eventos (de mouse, de teclas e outros). Quando ocorre um evento, ele é despachado para os ouvintes de eventos do tipo apropriado. O despacho do evento é simplesmente uma chamada ao método de tratamento de eventos para cada ouvinte registrado para esse tipo de evento. Cada tipo de evento tem uma interface listener de eventos correspondente. Por exemplo, ActionEvents são tratados por ActionListeners, MouseEvents por MouseListeners (e MouseMotionListeners) e KeyEvents por KeyListeners. Tratamento de Eventos – Como funciona Como o componente GUI sabe que deve chamar actionPerformed() em vez de outro método de tratamento de eventos? Quando um evento é gerado por uma interação do usuário com um componente, esse componente recebe um ID (Identificador) de evento exclusivo, que especifica o tipo de evento que ocorreu. O componente GUI utiliza o ID de evento para decidir o tipo de ouvinte para o qual o evento deve ser despachado e o método a chamar. No caso de um ActionEvent, o evento é despachado para cada método actionPerformed de ActionListener registrado (o único método na interface ActionListener). No caso de um MouseEvent, o evento é despachado para cada MouseListener registrado (ou MouseMotionListener, dependendo do evento que ocorrer). O ID de evento do MouseEvent determina qual dos sete métodos diferentes de tratamento de eventos de mouse é chamado. A lógica de toda essa decisão é tratada para o desenvolvedor pelos componentes GUI. JButton – Exercício • Modifique o exemplo anterior para que o mecanismo de tratamento do evento associado ao botão com o ícone apresente uma tela em que o usuário entrará com uma frase de sua escolha. Swing – JTextField e JPasswordField As classes JTextField e JPasswordField em Java permitem que o usuário insira textos de uma única linha ou simplesmente que um texto seja exibido em uma linha. A classe JTPasswordField é utilizada para apresentação de senhas, ou seja, com o texto escondido na interface. Quando o usuário digita textos em objetos dessas classes e, em seguida, pressionar Enter, ocorre um evento de ação no aplicativo. Se o programa implementa um ouvinte de eventos (listeners), esse processa o evento, podendo utilizar os textos que estão nos objetos de JTextField ou JPasswordField no momento em que ocorreu o evento no programa. A classe JTextField estende a classe JTextComponent, que fornece muitos recursos comuns para os componentes baseados em texto do Swing. A classe JPasswordField estende a classe JTextField e adiciona vários métodos específicos para senhas. Swing – JTextField e JPassword- Exemplo Exemplo: Solução: desenvolver um aplicativo Java que apresente quatro campos de edição, sendo um para o usuário colocar uma frase, outro para apresentar uma frase editável, outro para apresentar um texto inalterável e um último para registrar senhas. Trate os eventos associados ao acionamento da tecla enter em cada um desses campos de edição. 1. 2. 3. 4. 5. 6. Criar uma classe pública (ex: ExemploJTextField) estendendo JFrame e contendo três objetos de JTextField (para guardar os campos de edição) e um objeto de JPasswordField (para guardar o campo de senha) No construtor de objetos da sua classe pública invoque a superclasse JFrame (com o comando super(“texto com o título do frame”), passando como parâmetro o título da tela que criará e crie um Container ajustando o layout para FlowLayout Inicialize o 1o objeto de JTextField com dimensão default (tamanho de 10), o segundo com texto default (“digite seu texto aqui”), o terceiro com texto e visibilidade default (com texto “campo de texto não editável” e tamanho 20) e o quarto com texto default (“digite sua senha”), adicionando-os ao container. Crie um gerenciador de eventos para campos de texto e adicione os quatro objetos da sua classe aos listeners (usando addActionListener()) Implemente a classe privada com o gerenciamento dos eventos para os botões. Na função main() crie uma instância de sua classe, chame o construtor e encerre o programa com o método setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE). Swing – JTextField e JPasswordField // Exemplo de JTextField import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploJTextField extends JFrame { private JTextField campoTexto1, campoTexto2, campoTexto3; private JPasswordField campoSenha; // configuração da GUI public ExemploJTextField() { super("Testando JTextField e JPasswordField"); Container container = getContentPane(); container.setLayout(new FlowLayout()); // constrói o 1o campo de texto com dimensões default campoTexto1 = new JTextField(10); container.add(campoTexto1); // constrói o 2o campo de texto com texto default campoTexto2 = new JTextField("Digite seu texto aqui:"); container.add(campoTexto2); // constrói o 3o campo de texto com texto default e // 20 elementos visíveis, sem tratador de eventos campoTexto3 = new JTextField("Campo de texto não editável",20); campoTexto3.setEditable(false); container.add(campoTexto3); // constrói o 4o campo de texto com texto default campoSenha = new JPasswordField("Texto oculto"); container.add(campoSenha); ... JTextField e JPasswordField - Exemplo ... // registra os tratadores de evento GerenciadorTextField gerenteTexto = new GerenciadorTextField(); campoTexto1.addActionListener(gerenteTexto); campoTexto2.addActionListener(gerenteTexto); campoTexto3.addActionListener(gerenteTexto); campoSenha.addActionListener(gerenteTexto); setSize(325,100); setVisible(true); } public static void main(String args[]) { ExemploJTextField programaTexto = new ExemploJTextField(); programaTexto.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //classe interna privativa para tratamento de eventos private class GerenciadorTextField implements ActionListener { //processa eventos de campos de texto public void actionPerformed(ActionEvent evento) { String texto = ""; // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto1 if (evento.getSource() == campoTexto1) texto = "campoTexto1: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto2 else if (evento.getSource() == campoTexto2) texto = "campoTexto2: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JTextField campoTexto3 else if (evento.getSource() == campoTexto3) texto = "campoTexto3: " + evento.getActionCommand(); // evento:Usuário pressiona ENTER no objeto de JPasswordField campoSenha else if (evento.getSource() == campoSenha) { JPasswordField senha = (JPasswordField) evento.getSource(); texto = "campoSenha: " + new String(campoSenha.getPassword()); } JOptionPane.showMessageDialog(null,texto); } } // fim da classe interna privativa GerenciadorTextField } // fim da classe ExemploJTextField Swing – JCheckBox e JRadioButton Para que o usuário interaja com um aplicativo Java, existem diversos tipos de botões para cada situação de interface. Os componentes GUI Swing possuem três tipos de botões de estado (que assumem valores ativados/desativados ou verdadeiro/falso): JToggleButton – para barras de ferramentas JCheckBox – para interfaces de múltipla escolha JRadioButton – escolha única entre múltiplas alternativas javax.swing.AbstracButton Javax.swing.JButton Javax.swing.ToggleButton Javax.swing.JCheckBox Javax.swing.JRadioButton Swing – JCheckBox e JRadioButton - Exemplo Exemplo: aplicativo Java que permita que o usuário digite uma frase e veja sua sentença aparecer em negrito, dependendo de sua escolha. itálico ou em ambos, Solução: 1. Criar uma classe pública (ex: ExemploCheckBox) que tenha um objeto de JTextField (para a frase) e dois objetos de JCheckBox (uma para cada fonte que será escolhida) 2. No construtor de objetos da classe pública criar uma instância da classe Container para configurar a GUI. 3. Ajustar o objeto de Container para o layout FlowLayout 4. Inicializar o objeto de JTextField com a criação de uma instância, passando a frase a ser modificada e usando setFont para ajustar a fonte 5. Inicializar os objetos de JCheckBox da classe com as legendas das fontes e adicioná-los ao container 6. Criar o gerenciador de CheckBox para o tratamento de eventos, com sua classe interna de tratamento, onde são colocados os eventos de troca de fontes. Swing – JCheckBox e JRadioButton // Exemplo de JCheckBox e JRadioButton import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploCheckBoxRadio extends JFrame { private private private private JCheckBox checkB, checkI; JRadioButton rbotao1, rbotao2, rbotao3; ButtonGroup grupoRadio; JPanel painel1, painel2; // Configura a GUI public ExemploCheckBoxRadio() { super( "Testando CheckBox e RadioButton" ); // Cria o container e atribui o layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); // Cria os painéis painel1 = new JPanel(); painel2 = new JPanel(); // Cria os objetos CheckBox, adiciona para o painel e // adiciona o painel para o container checkB= new JCheckBox("Bold"); painel1.add(checkB); checkI = new JCheckBox("Itálico"); painel1.add(checkI); container.add(painel1); ... Swing – JCheckBox e JRadioButton // Cria os objetos RadioButton, adiciona para o painel e //adiciona o painel para o container rbotao1 = new JRadioButton("Plain", true); painel2.add(rbotao1); rbotao2 = new JRadioButton("Bold", false); painel2.add(rbotao2); rbotao3 = new JRadioButton("Itálico", false); painel2.add(rbotao3); container.add(painel2); //Cria o relacionamento lógico entre os objetos JRadioButton grupoRadio = new ButtonGroup(); grupoRadio.add(rbotao1); grupoRadio.add(rbotao2); grupoRadio.add(rbotao3); //Registra os tratadores de evento Gerenciador gerente = new Gerenciador(); checkB.addItemListener( gerente ); checkI.addItemListener( gerente ); rbotao1.addItemListener( gerente ); rbotao2.addItemListener( gerente ); rbotao3.addItemListener( gerente ); setSize( 300, 100 ); setVisible( true ); } ... Swing – JCheckBox e JRadioButton // Classe interna para tratamento de evento private class Gerenciador implements ItemListener { // Método de manipulação do evento public void itemStateChanged( ItemEvent event ) { //Testa qual objeto foi pressionado if (event.getSource() == checkB) { JOptionPane.showMessageDialog( null, "O check box Bold foi selecionado" ); } else if (event.getSource() == checkI) { JOptionPane.showMessageDialog( null, "O check box Itálico foi selecionado" ); } else if ((event.getSource() == rbotao1) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button Plain foi selecionado" ); } else if ((event.getSource() == rbotao2) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button bold foi selecionado" ); } else if ((event.getSource() == rbotao3) && (event.getStateChange() == ItemEvent.SELECTED)) { JOptionPane.showMessageDialog( null, "O radio button Itálico foi selecionado" ); } } } // fim da classe interna Gerenciador // Método principal public static void main(String args[]) { ExemploCheckBoxRadio application = new ExemploCheckBoxRadio(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // fim da classe ExemploCheckBoxRadio Swing – JComboBox - Exemplo Exemplo: aplicativo Java que permita ao usuário escolher itens relacionados ComboBox distintos. em dois componentes Solução: 1. 2. 3. 4. 5. 6. 7. Criar uma classe pública (ex: ExemploComboBox) que tenha dois objetos JComboBox e um objeto do tipo Vector. No construtor de objetos da classe pública criar uma instância da classe Container para configurar a GUI. Ajustar o objeto de Container para o layout FlowLayout Adicionar alguns itens para o objeto ComboBox através do método add() e definir o item selecionado por padrão Adicionar esse primeiro ComboBox objeto para o container. Adicionar uma lista de itens para o objeto do tipo Vector, utilizar esse vetor na criação do segundo ComboBox e adicionar este objeto ao container Criar o gerenciador de ComboBox para o tratamento de eventos, com sua classe interna de tratamento, onde deve ser apresentado o conteúdo do texto quanto o item for selecionado. Swing – JComboBox import import import import java.awt.*; java.awt.event.*; javax.swing.*; java.util.*; public class ExemploComboBox extends JFrame { private JComboBox cbb = new JComboBox(); private JComboBox cbb1; private Vector cor = new Vector(); // Configurando a GUI public ExemploComboBox() { super( "Testando JComboBox" ); // Cria um container e define o modelo de layout (FlowLayout) Container container = getContentPane(); container.setLayout( new FlowLayout() ); // Adiciona os elementos para o primeiro Combo cbb.addItem("Disciplina 1"); cbb.addItem("Disciplina 2"); cbb.addItem("Disciplina 3"); //Define o item que estará selecionado cbb.setSelectedItem("Disciplina 2"); //Adiciona para o container container.add( cbb ); //Preenche o vetor cor.add("Verde"); cor.add("Amarelo"); cor.add("Azul"); cor.add("Branco"); Swing – JComboBox //Cria um Combo utilizando o vetor cbb1 = new JComboBox(cor); //Adiciona para o container container.add( cbb1 ); // registra os tratadores de evento GerenciadorComboBox gerenteCB = new GerenciadorComboBox(); cbb.addItemListener(gerenteCB); setSize( 300, 170 ); setVisible( true ); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class GerenciadorComboBox implements ItemListener { //processa eventos associados aos objetos ComboBox public void itemStateChanged(ItemEvent evento) { String texto = ""; if ((evento.getSource() == cbb) && (evento.getStateChange() == ItemEvent.SELECTED)){ JOptionPane.showMessageDialog(null, "O elemento selecionado foi "+cbb.getSelectedItem()); } } } // fim da classe interna // Método principal da aplicação public static void main( String args[] ){ ExemploComboBox combobox = new ExemploComboBox(); } } // final da classe Swing – JList - Exemplo Exemplo: aplicativo Java que permita ao usuário selecionar uma determinada cor de uma lista, que será aplicada ao frame, alterando a cor de acordo com a cor (item) selecionada. Solução: 1. Criar uma classe pública (ex: ExemploList) que tenha um objeto JList, um array de Strings e um array do tipo Color 2. No construtor da classe crie uma instância da classe Container para configurar a GUI. Ajustar o objeto de Container para o layout FlowLayout. 3. 4. 5. 6. Criar o objeto JList utilizando o array com os nomes das cores e definir o modo de seleção como simples. Adicionar o objeto JList para o container Criar o gerenciador para o tratamento de eventos onde ao ser escolhido determinado item da lista seja alterada a cor do frame. Utilize o método setBackground(Color) do objeto Container. Swing – JList // Exemplo adaptado do Deitel & Deitel import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class ExemploList extends JFrame { private JList listaCores; private Container container; private String nomeCores[] = { "Preto", "Azul", "Cyan", "Cinza Escuro", "Cinza", "Verde", "Cinza Claro", "Magenta", "Laranja", "Vermelho", "Branco", "Amarelo" }; private Color cores[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.red, Color.white, Color.yellow }; // Configuração da GUI public ExemploList() { super("Testando JList"); // Obtém o painel e configura o layout container = getContentPane(); container.setLayout( new FlowLayout() ); // Cria uma lista com os nomes das cores // e define o tamanho máximo da lista para 5 elementos listaCores = new JList( nomeCores ); listaCores.setVisibleRowCount( 5 ); Swing – JList // Permite somente a seleção de uma únida linha listaCores.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); // Adiciona um JScrollPane para permitir a rolagem // horizontal e vertical container.add( new JScrollPane( listaCores ) ); GerenciadorList gerenteList = new GerenciadorList(); listaCores.addListSelectionListener(gerenteList); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize( 350, 150 ); setVisible( true ); } //Classe que gerencia os eventos private class GerenciadorList implements ListSelectionListener { // Método de manipulação do evento public void valueChanged( ListSelectionEvent evento ) { container.setBackground(cores[listaCores.getSelectedIndex()] ); } } // fim da classe interna public static void main( String args[] ) ExemploList lista = new ExemploList(); } } // final da classe { Swing – Menus Os menus são parte integrante das GUIs; Permite que a interface fique mais organizada; Os menus podem ser anexados somente aos objetos das classes que fornecem o método setJMenuBar(). Duas dessas classes são JFrame e JApplet; As classes utilizadas para definir menus são JMenuBar, JMenuItem, JCheckBoxMenuItem e JRadioButtonMenuItem; A classe JMenuBar contém os métodos necessários para gerenciar uma barra de menus; A classe JMenu contém os métodos necessários para gerenciar menus; Os menus contêm itens de menu e são adicionados à barra de menus ou a outros menus como submenus; Swing – Menus A classe JItemMenu contém os métodos necessários para gerenciar os itens dos menus; O item de menu é um componente GUI pertencente ao componente menu que quando selecionado realiza determinada ação; A classe JCheckBoxMenuItem contém os métodos necessários para gerenciar itens de menu que podem ser ativados ou desativados; A classe JRadioButtonMenuItem contém os métodos necessários para gerenciar itens de menu que também podem ser ativados ou desativados. Swing – Menus - Exemplo Exemplo: desenvolver um aplicativo Java que apresente três menus: Cadastro, Relatórios e Ajuda na barra superior da janela. O primeiro menu deve possibilitar o cadastro de Paciente e Médicos e permitir que o sistema seja finalizado. O terceiro menu deve ter um item que possibilite a visualização de um tela com informações do sistema (Sobre). Solução: 1. 2. 3. 4. 5. 6. Criar uma classe pública (ex: ExemploMenu) estendendo JFrame e contendo um objeto JMenuBar (barra de menus), três objetos JMenu (para receber os menus) e quatro objetos JMenuItem (para receber os itens dos menus). No construtor da classe atribua o título da janela (setTitle(String)) e crie a barra de menu. No construtor crie os menus, determine a letra que será anexada a tecla “Alt” para possibilitar acesso rápido (setMnemonic(char)) e adicione para a barra de menu. Ainda no construtor crie os itens de menu e adicione para os menus correspondentes. Após criar os objetos crie um objeto da classe Gerenciador. Essa instância será capaz de tratar os eventos associados ao item de menu que finaliza o sistema e também ao item que apresentação a tela com as informações (Sobre). Adicione esse objeto aos listeners dos eventos (addActionListener()) Implemente a classe privada Gerenciador, que deve implementar a interface ActionListeners com o tratamento dos eventos associados aos itens de menu. Para isso, implemente o método actionPerformed() para cada item. Swing – Menus import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploMenu extends JFrame { private private private private private private JMenuBar barraMenu; JMenu mCad, mRel, mAjuda; JMenuItem iPac, iMed, iFim, iSobre; String sistema = "Sistema de Gerenciamento de Clínicas"; String versao = "Versao 1.0"; String build = "(build 20030626)"; // Configura a GUI public ExemploMenu() { //Atribui o título para a janela setTitle(sistema); //Cria a barra de menus barraMenu = new JMenuBar(); //Cria os menus e adiciona para a barra mCad = new JMenu("Cadastro"); mCad.setMnemonic('C'); mRel = new JMenu("Relatórios"); mRel.setMnemonic('R'); mAjuda = new JMenu("Ajuda"); mAjuda.setMnemonic('A'); barraMenu.add(mCad); barraMenu.add(mRel); barraMenu.add(mAjuda); ... O método setMnemonic(char) permite definir o caracter de atalho utilizado conjuntamente com a tecla Alt Swing – Menus //Cria os itens de menu iPac = new JMenuItem("Paciente"); iPac.setMnemonic('P'); iMed = new JMenuItem("Médico"); iMed.setMnemonic('M'); iFim = new JMenuItem("Finaliza"); iFim.setMnemonic('F'); iSobre = new JMenuItem("Sobre"); iSobre.setMnemonic('S'); //Adiciona os itens para o menu de Cadastro mCad.add(iPac); mCad.add(iMed); mCad.addSeparator(); mCad.add(iFim); //Adiciona o iten sobre para o menu Ajuda mAjuda.add(iSobre); // registra os tratadores de evento Gerenciador gerente = new Gerenciador(); iPac.addActionListener(gerente); iFim.addActionListener(gerente); iSobre.addActionListener(gerente); //Anexa a barra de menu a janela setJMenuBar(barraMenu); setSize(800,600); setVisible(true); //Configura para permitir o fechamento da aplicação //quando a janela for fechada setDefaultCloseOperation(EXIT_ON_CLOSE); } .... Swing – Menus private class Gerenciador implements ActionListener { //processa eventos de campos de texto public void actionPerformed(ActionEvent evento) { if (evento.getSource() == iPac) { //ExemploGridBagLayout cadastro = new ExemploGridBagLayout(); } else if (evento.getSource() == iFim) { System.exit(0); } else if (evento.getSource() == iSobre) { JOptionPane.showMessageDialog( null, sistema+"\n\n"+" "+versao+" "+build+"\n\n", "Sobre o sistema", JOptionPane.PLAIN_MESSAGE ); } } } public static void main (String arg[]) { ExemploMenu menuGeral = new ExemploMenu(); } } //Fim da classe ExemploMenu Menus – Exercício • Modifique o exemplo anterior inserindo os menus e itens de menus referente ao exercício sobre cadastro de estudantes, disciplinas e turmas (essa classe tem comportamento de Limite e já deve ser implementada para possibilitar sua utilização no exercício). Swing - Gerenciadores de Layouts Os gerenciadores de layout são fornecidos para organizar componentes GUI em um container para que estes sejam apresentados; FlowLayout BorderLayout Organiza os componentes em cinco áreas: norte, sul, leste, oeste e centro. GridLayout Coloca os componentes seqüencialmente (da esquerda para a direita) na ordem em que foram adicionados. Organiza os componentes em linhas e colunas. BoxLayout Permite que os componentes sejam organizados da esquerda para a direita ou de cima para baixo em um container. Swing - Gerenciadores de Layouts CardLayout GridBagLayout Empilha componentes como uma pilha de cartas. Semelhante a GridLayout mas permite que o tamanho de cada componente varie e que estes possam ser definidos em qualquer ordem. Existe também a possibilidade de se indicar null para o tipo de layout. Isso significa que nenhum dos gerenciadores serão utilizados. Em função disso o posicionamento passa a ser absoluto, dependente de plataforma e resolução de vídeo. Deve então utilizar o método setBounds(x, y, width, height), onde, x (deslocamento a partir da esquerda – eixo x), y (deslocamento a partir do topo – eixo y), width (tamanho) e height (altura). Swing - GridBagLayout É o mais poderoso dos gerenciadores de layout; Os componentes adicionados para o layout podem variar em tamanho, isto é, eles podem ocupar múltiplas linhas e colunas; Podem ser adicionados em qualquer ordem; A tela é dividida em linhas e colunas representando as células que serão ocupadas pelos componentes; Swing - GridBagLayout 0 0 1 Linha 2 3 4 1 2 Coluna 3 Swing - GridBagLayout Duas classes são importantes para definição do layout. GridBagConstraints Insets GridBagConstraints. GridBagConstraints() GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) Swing - GridBagLayout gridx especifica a coluna gridy especifica a linha gridwidth especifica o número de células ocupadas na linha pelo componente gridheight especifica o número de células ocupadas na coluna pelo componente weightx especifica como distribuir o espaço horizontal extra weighty especifica como distribuir o espaço vertical extra anchor determina o alinhamento do objeto. CENTER, NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, e NORTHWEST. O padrão é CENTER fill permite o redimensionamento do componente quando este é maior que a célula. NONE, HORIZONTAL, VERTICAL, BOTH insets permite realizar ajustes extras no posicionamento dos componentes ipadx permite ajustes adicionais na linha ipady permite ajustes adicionais na coluna Swing - GridBagLayout Insets Insets(int top, int left, int bottom, int right) top a distância em relação ao topo left a distância em relação a esquerda bottom a distância em relação a base right a distância em relação a direita top left right bottom Swing - GridBagLayout container.add(lblNome, new GridBagConstraints (0, 0, 1, 1, 0, 0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 10, 0, 10), 0, 0) Swing - GridBagLayout container.add(edtNome, new GridBagConstraints (1, 0, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(30, 10, 0, 10), 0,0)); Swing – GridBagLayout - Exemplo Exemplo: desenvolver um aplicativo Java que apresente uma interface GUI possibilitando que o usuário informe os dados cadastrais de um paciente (Nome, Endereço, Idade, CPF). Essa interface deve ainda possuir três botões um que apresenta a relação de pacientes, um para confirmar as informações e outro para finalizar o janela. Solução: 1. Criar uma classe pública (ex: ExemploGridBagLayout) estendendo JFrame e contendo quatro objetos JLabel (rótulos para identificação dos campos de edição), quatro objetos JTextFiedl (campos de edição), três objetos JButton (para os controle da interface), um objeto Container e um objeto GridBagLayout (para definição do layout da interface). 2. No construtor da classe atribuir o painel getContentPane() para o container e configurar o layout. 3. Adicionar cada componente JLabel, JTextEdit, JButton para o container utilizando GridBagLayout(). 4. No construtor da classe atribuir o título da janela (setTitle(String)). 5. Após adicionar os objetos para o layout criar um objeto da classe GerenciadorGeral. Essa instância será capaz de tratar os eventos associados ao botão que finaliza o sistema. Adicione esse objeto ao listener do evento (addActionListener()). 6. 7. Definir as configurações básicas tais como: título da janela setTitle(String), setResizable(boolean), setSize(int, int) e setVisible(boolean). Implementar a classe privada GerenciadorGeral, que deve implementar a interface ActionListeners com o tratamento dos eventos associados ao botão que finaliza o sistema. Para isso, implemente o método actionPerformed(). Swing – GridBagLayout import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExemploGridBagLayout extends JFrame { private final String strTitulo = "Cadastro de Pacientes"; //Cria os rótulos private JLabel lblNome = new JLabel("Nome:"); private JLabel lblEndereco = new JLabel("Endereço:"); private JLabel lblIdade = new JLabel("Idade:"); private JLabel lblDocumento = new JLabel("CPF:"); //Cria public public public public os campos de edição JTextField edtNome = new JTextField(); JTextField edtEndereco = new JTextField(); JTextField edtIdade = new JTextField(); JTextField edtCPF = new JTextField(); //Cria os botões private JButton btnConfirmar = new JButton("Confirmar"); private JButton btnCancelar = new JButton("Cancelar"); private JButton btnRelacaoPacientes = new JButton("Relação de Pacientes"); //Cria o container e o layout private Container container = new Container(); private GridBagLayout layout = new GridBagLayout(); .... Swing – GridBagLayout public ExemploGridBagLayout() { //Configura o layout container = getContentPane(); container.setLayout(layout); //Adiciona os componentes ao container //Rótulos e campos de edição container.add(lblNome, new GridBagConstraints(0, 0, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 10, 0, 10), 0, 0)); container.add(edtNome, new GridBagConstraints(1, 0, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(30, 10, 0, 10), 0, 0)); container.add(lblEndereco, new GridBagConstraints(0, 1, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtEndereco, new GridBagConstraints(1, 1, 3, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0, 10), 0, 0)); container.add(lblIdade, new GridBagConstraints(0, 2, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtIdade, new GridBagConstraints(1, 2, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0, 10), 0, 0)); container.add(lblDocumento, new GridBagConstraints(0, 3, 1, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0)); container.add(edtCPF, new GridBagConstraints(1, 3, 2, 1, 0, 0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 0, 150), 0, 0)); .... Swing – GridBagLayout //Botões container.add(btnRelacaoPacientes, new GridBagConstraints(0, 4, 2, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(100, 10, 17, 0), 0, 0)); container.add(btnConfirmar, new GridBagConstraints(2, 4, 1, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(100, 127, 17, 0), 0, 0)); container.add(btnCancelar, new GridBagConstraints(3, 4, 1, 1, 0, 0 ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(100, 0, 17, 10), 0, 0)); //Registra o tratador de eventos GerenciadorGeral gerGeral = new GerenciadorGeral(); btnCancelar.addActionListener(gerGeral); //Define as configurações gerais setTitle(strTitulo); setResizable(false); setSize(500, 300); setVisible(true); } private class GerenciadorGeral implements ActionListener { public void actionPerformed(ActionEvent evento) { if (evento.getSource() == btnCancelar) System.exit(0); } } public static void main (String par[]) { ExemploGridBagLayout exemplo = new ExemploGridBagLayout(); } } Swing – Exemplo usando posição absoluta import java.awt.*; import javax.swing.*; public class PosicaoAbsoluta extends JFrame { private JLabel lblLNome = new JLabel("Nome:"); private JTextField txtLNome = new JTextField(); private JLabel lblLEndereco = new JLabel("Endereço:"); private JTextField txtLEndereco = new JTextField(); public PosicaoAbsoluta() { super.setTitle("Exercício"); Container container = getContentPane(); container.setLayout(null); O construtor do objeto Rectangle é composto pelos seguintes parâmetros: Rectangle(x, y, width, height); x: posição horizontal na tela y: posição vertical na tela width: comprimento height: altura lblLNome.setBounds(new Rectangle(35, 35, 100, 19)); txtLNome.setBounds(new Rectangle(101, 36, 300, 20)); container.add(lblLNome); container.add(txtLNome); lblLEndereco.setBounds(new Rectangle(35, 75, 100, 19)); txtLEndereco.setBounds(new Rectangle(101, 76, 300, 20)); container.add(lblLEndereco); container.add(txtLEndereco); setResizable(true); setSize(520, 180); setVisible(true); } public static void main (String args[]){ PosicaoAbsoluta posicao = new PosicaoAbsoluta(); posicao.setDefaultCloseOperation(EXIT_ON_CLOSE); } } Exercício Alterar o sistema de cadastro de estudantes, disciplinas e turmas para utilizar os componentes de interface gráfica, tanto para entrada como para apresentação de informações. Obs.: Como o exercício foi implementado utilizando o modelo MVC, é necessário somente fazer alterações nas classes limites, pois as regras de negócio estão implementadas nos controladores.