O documento discute interfaces gráficas do usuário (GUI) em Java, incluindo componentes Swing, eventos de mouse, caixas de diálogo e campos de texto. Ele fornece detalhes sobre como construir interfaces gráficas usando classes como JButton, JTextField e JList.
3. Uma interface gráfica (GUI) apresenta um mecanismo
amigável ao usuário para interagir com um aplicativo.
Uma GUI dá ao aplicativo uma aparência e
comportamento distintos.
Uma boa interface facilita o aprendizado e utilização do
aplicativo pelo usuário.
As GUI são construídas a partir de componentes GUI.
Um componente GUI é um objeto que permite ao
usuário interagir via mouse, teclado, formulário,
reconhecimento de voz, etc.
Muitas IDEs fornecem ferramentas de projeto GUI para
facilitar a construção da interface.
Introdução
4. É possível utilizar uma caixa de diálogo para interagir
com o usuário.
A caixa de diálogo é utilizada para receber informações
do usuário ou exibir informações para o usuário.
A classe JOptionPane do pacote javax.swing fornece
caixas de diálogos pré-construídas tanto para entrada
como para saída.
Esses diálogos são exibidos invocando métodos
JOptionPane static.
Uma caixa de diálogo modal só deve ser usada quando
for necessário impedir usuários de interagir com um
restante de um aplicativo até que eles descartem o
diálogo.
Não é necessário a criação de um objeto para utilizar
os métodos showInputDialog, showMessageDialog e
parseInt. São métodos invocados a partir da classe.
JOptionPane
5. Somente as caixas de diálogo não atendem todos os
requisitos de uma boa interface.
A maioria dos aplicativos exige interfaces mais
elaboradas e personalizadas.
Por isto, há muitos componentes GUI Swing no pacote
javax.
A maioria dos componentes são componentes Java
puros (são escritos, manipulados e exibidos em Java).
Estes componentes fazerm parte das Java Foundatiton
Classes (JFC) – bibliotecas para desenvolvimentos de
GUI para múltiplas plataformas.
Componentes Swing
6. Há dois pacotes básicos que auxiliam na criação de
componentes: java.awt e javax.swing.
Os componentes java.awt são desenhados conforme a
plataforma de execução.
Os componentes java.awt dependem da plataforma
local para determinar sua funcionalidade, aparência e
comportamento. São componentes pesados.
Os componentes javax.swing assumem a mesma
aparência em qualquer plataforma. São componentes
leves.
A principal hierarquia de classes utilizadas na
construção de GUI é descrita abaixo:
Object >> Component >> Container >> JComponent
Componentes Swing
7. Os componentes derivados de JComponent possui
vários recursos:
aparência e comportamento plugáveis (personalização
conforme plataforma)
teclas de atalho (mnemônicos) para acesso direto dos
componentes pelo teclado.
capacidade de tratamento de eventos
breve descrição do propósito do componente (dica de
ferramenta)
suporte para acessibilidade (leitores de tela em braile)
suporte para localização de interface com o usuário
(diferentes linguas e culturas)
Componentes Swing
8. A maioria das janelas podem conter componentes
Swing e são instâncias da classe JFrame ou uma
subclasse de JFrame.
JFrame é uma subclasse indireta de java.awt.Window e
descende diretamente de java.awt.Frame.
A classe java.awt.Window fornece atributos e
comportamentos básicos de uma janela.
barra de título na parte superior
botões para minimizar, maximizar e fechar a janela.
Um JLabel (rótulo) fornece um texto que declara a
finalidade de cada componente dentro de uma janela.
Pode exibir apenas texto, uma imagem ou uma
combinação de imagem com texto.
A Janela e seus Componentes
9. O gerenciador de layout FlowLayout organiza os
componentes da esquerda para a direita. Sempre
reorganiza os componentes quando as dimensões do
container (JFrame) são alteradas.
O método setLayout é utilizado para definir qual
gerenciador de layout deve ser utilizado.
Todos os componentes devem ser adicionados
explicitamente dentro do contêiner.
Um Icon é um objeto que implementa a interface
javax.swing.Icon. A classe ImageIcon é um exemplo.
A classe ImageIcon suporta vários formatos de imagem
(GIF, PNG, JPEG).
A Janela e seus Componentes
10. A interface javax.swing.SwingConstants declara um
conjunto de constantes que são usadas para muitos
componentes Swing.
Às vezes, as constantes são utilizadas para auxiliar no
posicionamento dos textos e ícones dentro de um
JLabel.
SwingConstants.LEFT
SwingConstants.CENTER
SwingConstants.RIGTH
SwingConstants.TOP
SwingConstants.CENTER
SwingConstants.BOTTON
A Janela e seus Componentes
11. O usuário interage com uma GUI para indicar as
tarefas que devem ser executadas pelo aplicativo.
As GUIs são baseadas em evento.
Quando o usuário interage com a GUI gera um evento
que guia o programa na realização de uma tarefa.
Alguns exemplos de evento:
clicar em um botão
digitar em um campo de texto
selecionar um item do menu
fechar uma janela
mover o mouse
Eventos
12. A classe JText estende a classe JTextComponent que
fornece muitos recursos comuns aos componentes
baseados em texto.
A classe JPasswordField estende a classe JTextField e
adiciona métodos de processamento de senhas.
Ambos os componentes representam uma área de uma
única linha onde o usuário pode inserir um texto.
Um JPasswordField mostra que caracteres estão sendo
digitados, mas oculta os caracteres reais.
Quando o usuário digita um texto em um dos
componentes e tecla ENTER um evento ocorre.
O texto só pode ser digitado para o componente que
estiver em foco.
Um componente recebe o foco quando o usuário clica no
componente. Isto é importante para capturar
corretamente a origem do evento.
JTextField e JPasswordField
13. Uma classe interna normalmente é utilizada para
implementar processadores de eventos (handlers de
evento).
O objeto de classe interna pode acessar todos os
membros da classe externa.
Um evento de ação é representado pela classe
java.awt.event.ActionEvent.
Um evento de ação deve ser processado por um objeto
que implemente a interface
java.awt.event.ActionListener.
Como o JPasswordField descende de JTextField, ambos
suportam os mesmos eventos.
Um ouvinte de evento deve implementar a interface
apropriada de ouvinte de evento.
JTextField e JPasswordField
14. Muitos tipos diferentes de eventos podem ocorrer quando
o usuário interage com uma GUI.
As informações de evento são armazenados em um objeto
de uma classe que estende java.awt.AWTEvent.
Veja a hierarquia de eventos abaixo:
AWTEVent
ActionEvent
AdjustmentEvent
ItemEvent
TextEvent
ComponentEvent
ContainerEvent
FocusEvent
PaintEvent
WindowEvent
InputEvent
KeyEvent
MouseEvent
MouseWheelEvent
Tipos de Eventos e Interfaces
15. Tipos adicionais de evento específicos dos componentes
Swing são declarados no pacote javax.swing.event.
Para trabalhar com processamento de eventos precisamos
identificar três elementos.
a origem do evento (componente GUI com o qual o usuário
interage)
o objeto do evento (objeto que guarda informações sobre o
evento que ocorreu)
o ouvinte do evento (objeto que é notificado pela origem quando
um evento ocorre e executa um método em resposta ao evento)
O processamento de um evento gerado por um objeto
(origem) é delegado a um outro objeto (ouvinte).
Este modelo é chamado de modelo de delegação de
evento.
Para cada tipo de evento há uma interface listener de
evento correspondente.
Tipos de Eventos e Interfaces
16. Cada interface listener de eventos especifica um ou mais
métodos de tratamento de evento que devem ser
declarados na classe que implementa a interface.
Cada classe que implementa uma interface deve declarar
(definir o código) todos os métodos dessa interface.
Cada JComponent tem uma variável de instância
chamada listenerList que referencia um objeto de classe
javax.swing.event.EventListenerList para registrar os
seus ouvintes (listeners).
Um componente pode ter vários ouvintes registrados para
processar os seus eventos.
Cada tipo de evento é tratado por uma interface listener
apropriada:
ActionEvent é tratado por ActionListener
MouseEvent é tratado por MouseListener e MouseMotionListener
KeyEvent é tratado por KeyListener
Tipos de Eventos e Interfaces
17. A partir do evento, o componente decide qual o tipo de
ouvinte deve receber o evento e qual método deve ser
executado.
Em um ActionEvent, o evento é despachado para o método
actionPerformed de cada ActionListener registrado.
Em um MouseEvent, o evento é despachado para cada
MouseListener ou MouseMotionListener registrado, e o
método correto será invocado.
O componente saberá chamar o método apropriado
para cada evento que ocorre, mas para isto é
necessário que o handler (tratador ou ouvinte) de
evento seja registrado no componente corretamente.
Tipos de Eventos e Interfaces
18. Um botão é usado pelo usuário para disparar uma ação
específica por meio de um clique.
Um aplicativo Java pode usar vários tipos de botões:
botões de comando
caixas de seleção
botões de alternação
botões de opção
Veja a hierarquia dos botões derivada do pacote
javax.swing
JComponent
AbstractButton
JButton
JToggleButton
JCheckBox
JRadioButton
Botões de Acão : JButton
19. O JButton representa um botão de comando e pode
possuir um texto em sua face (rótulo do botão).
Um botão de comando gera um ActionEvent quando é
clicado pelo usuário.
Um JButton pode exibir um Icon.
Um JButton pode exibir um Icon rollover (exibido
quando o usuário posiciona o mouse sobre o botão).
Botões de Acão : JButton
20. Há três tipos de botões de estado:
JToggleButton,
JCheckBox
JRadioButton.
O JRadioButton é utilizado para representar valores
mutuamente exclusivos.
O JCheckBox permite a escolha de múltiplos valores
inclusivos.
Botões de Estado: JCheckBox
21. Estes botões (JRadioButton) possuem dois estados:
selecionado e não-selecionado.
O ButtonGroup é utilizado para manter um
relacionamento lógico entre botões de opção.
O ButtonGroup não é exibido. Ele serve apenas para
agrupar os botões.
Este tipo de botão é muito útil para permitir a seleção
de itens mutuamente exclusivos.
Botões de Estado: JRadionButton
22. Uma caixa de combinação (lista drop-down) permite ao
usuário selecionar um item em uma lista.
As caixas de combinação são implementadas com a
classe JComboBox que estende JComponent.
JComboBox gera ItemEvent como JCheckBox e
JRadioButton.
Uma classe interna anônima tem acesso a todos os
membros da classe externa.
A classe interna anônima que implementa uma
interface, deve implementar cada método da interface.
Caixa de Combinação: JComboBox
23. Uma lista exibe uma séria de itens a partir da qual o
usuário pode selecionar um ou mais itens.
As listas são criadas com a classe JList, que estende
diretamente a classe JComponent.
A classe JList suporta listas de uma única seleção ou
listas de seleção múltipla.
Listas : JList
24. Há três modos de seleção para uma lista definidos pela
classe ListSelectionModel.
SINGLE_SELECTION (permite selecionar um item)
SINGLE_INTERVAL_SELECTION (permite selecionar em um
intervalo contíguo de itens)
MULTIPLE_INTERVAL_SELECTION (pode selecionar um
intervalo contínuo de itens)
Uma lista de seleção múltipla permite ao usuário
selecionar muitos itens de uma JList.
Listas : JList
25. As interfaces ouvintes de eventos do mouse são:
MouseListener
MouseMotionListener
Os eventos do mouse podem ser capturados por
qualquer component GUI que deriva de
java.awt.Component.
Eventos de Mouse
26. O pacote javax.swing.event contém a interface
MouseInputListener que estende as interfaces
MouseListener e MouseMotionListener para criar uma
única interface com todos os métodos.
Os métodos são chamados quando o mouse interage
com um Component, se objetos listeners de evento
apropriados forem registrados para esse Component.
Eventos de Mouse
27. Veja a lista de métodos de MouseListener:
mousePressed(MouseEvent event) : quando um botão do
mouse é pressionado enquanto o cursor do mouse estiver
sobre um component.
mouseClicked(MouseEvent event) : quando um botão do
mouse é pressionado e liberado enquanto o cursor do mouse
pairar sobre um componente. Esse evento é sempre precedido
por uma chamada para mousePressed.
Eventos de Mouse
28. Veja a lista de métodos de MouseListener:
mouseReleased(MouseEvent event) : quando um botão do
mouse é liberado depois de ser pressionado. do mouse estiver
sobre um component. Esse evento é sempre precedido por
uma chamada para mousePressed e uma ou mais chamadas
para mouseDragged.
mouseEntered(MouseEvent event) : quando o cursor do
mouse entra nos limites de um componente.
mouseExited(MouseEvent event) : quando o curso do mouse
deixa os limites de um componente.
Eventos de Mouse
29. Veja a lista de métodos de MouseMotionListener:
mouseDragged(MouseEvent event) : quando o botão do mouse
é pressionado enquanto o curso do mouse estiver sobre um
componente e o mouse é movido enquanto o botão do mouse
permanecer pressionado. Esse é evento é sempre precedido
por uma chamada de mousePressed. Todos os eventos de
arrastar são enviados para o componente em que o usuário
começoou a arrastar o mouse.
mouseMoved(MouseEvent event) : quando o mouse é movido
(sem pressionamento de botões) quando o curso do mouse
está sobre um componente. Todos os eventos de movimento
são enviados para o componente sobre o qual o mouse
atualmente está posicionado.
Eventos de Mouse
30. Cada método recebe como argumento um objeto
MouseEvent que contém informações sobre o evento de
mouse (incluindo as coordenadas x e y da localização
em que ocorreu o evento).
Os métodos e as constantes e classe InputEvent
permitem-lhe determinar o botão do mouse em que o
usuário clicou.
Há também a interface MouseWheelListener que
permite que aplicativos respondam à rotação da roda
de um mouse. Há métodos nesta interface que permite
obter informações sobre a quantidade de rotação da
roda.
Eventos de Mouse
31. Muitas interfaces ouvintes (Listener) possuem muitos
métodos.
Não é sempre desejável implementar todos os métodos
em uma interface ouvinte.
Por esta razão, o Java fornece classes adaptadoras que
implementa um interface e fornece um implementação
padrão (método vazio) para cada um dos métodos da
interface.
Classes Adaptadores: Adapters
32. Segue a lista de algumas classes Adaptadoras com
suas respectivas interfaces.
ComponentAdapter implementa ComponentListener
ContainerAdapter implementa ContainerListener
FocusAdapter implementa FocusListener
KeyAdapter implementa KeyListener
MouseAdapter implementa MouseListener
WindowAdapter implementa WindowListener
Classes Adaptadores: Adapters
33. Usando o Adapter, posso estender a classe adaptadora
ao invés de implementar a interface, para tratar os
eventos gerados pelos componentes da GUI.
A classe MouseEvent herda vários métodos de
InputEvent que podem distinguir os cliques do mouse e
a combinação dos cliques com pressionamento de
teclas do teclado.
Classes Adaptadores: Adapters
34. Os componentes leves do Swing que estendem
JComponent contém o método paintComponent que é
chamado quando um componente leve é exibido.
Este método pode ser sobrescrito para alterar a forma
como o componente deve ser exibido.
Um componente pode ser opaco ou transparente. O
método setOpaque() controla isto.
O método da superclasse (JComponent) deve ser
sempre o primeiro a ser chamado no método
paintComponent da subclasse.
O método repaint() indica que o componente deve ser
atualizado na tela o mais rápido possível.
Paineis : JPanel
35. Os eventos do teclado são tratados por uma classe que
implementa KeyListener.
Eventos de teclado são gerados quando teclas são
pressionadas e liberadas.
Os métodos keyPressed(), keyReleased() e keyTyped()
recebem um KeyEvent como argumento e definem o
código para tratamento do evento.
keyPressed() é invocado quando qualquer tecla é pressionada.
keyTyped() é invocado quando uma tecla que não é de ação é
invocada (home, end, setas, etc).
keyReleased() é chamado quando a tecla é lançada após um
dos métodos anteriores.
Eventos do Teclado
36. Os gerenciadores de layout organizam os componentes
GUI em um contêiner para propósito de apresentação.
Os gerenciadores ajudam a organizar os elementos
definindo de forma automática as dimensões e posição
de cada componente.
Todos os gerenciadores de layout implementam a
interface java.awt.LayoutManager.
O método setLayout() da classe Container aceita um
objeto que implementa a interface LayoutManager como
argumento.
Gerenciadores de Layout
37. Há basicamente três maneiras de organizar
componentes em uma GUI.
Posicionamento absoluto: você pode configurar o layout com
null e utilizar os métodos setSize e setLocation ou setBounds
para configurar cada componente. É mais trabalhoso.
Gerenciadores de layout: posiciona os elementos de forma
mais simples e rápida, mas perdemos um pouco o controle
sobre as dimensões e posicionamento dos elementos.
Posicionamento visual em uma IDE: algumas IDEs fornecem
ferramentas para construir layout com arrastar-e-soltar.
Além disto, é possível programar os eventos usando clique
duplo sobre os componentes. Neste caso, a IDE gera o código
Java necessário. A IDE fornece um controle bom sobre
posição, tamanho e alinhamento dos elementos.
Gerenciadores de Layout
38. Há vários gerenciadores de layout. Neste momento
focaremos em apenas três deles:
FlowLayout : todos os componentes são colocados em
sequência da esquerda para a direita na ordem em que foram
adicionados. É o padrão para JPanel.
BorderLayout: organiza os componentes em cinco áreas:
NORTH, SOUTH, EAST, WEST, CENTER. É o padrão para
JFrame.
GridLayout: organiza os componentes em linhas e colunas.
Gerenciadores de Layout
39. É o gerenciador mais simples. Os componentes são
colocados no contêiner da esquerda para a direita na
ordem em que foram adicionados.
Gerenciador FlowLayout
40. Organiza os componentes em cinco regiões do contêiner
e implementa a interface LayoutManager2.
Limita o contêiner a possuir apenas cinco elementos:
um por região.
O componente colocado na região pode ser outro
container que contenha outros componentes.
As regiões se expandem de acordo com as
características dos componentes inseridos nelas.
Gerenciador BorderLayout
41. A ausência de um componente em um região faz com
que a outra região se expanda para ocupar a área da
região vazia.
Se nenhuma região for indicada o componente será
adicionado ao centro.
Se mais de um componente for inserido em uma região,
apenas o último inserido será exibido.
Gerenciador BorderLayout
42. Divide o contêiner em uma grade.
A grade possui linha e colunas.
Todos os componentes da grade tem a mesma altura e
largura.
Cada componente é inserido em uma célula da grade.
Gerenciador GridLayout
43. Uma GUI complexa exige que cada componente seja
colocado em um local exato.
Estas GUIs, frequentemente, são formadas por
múltiplos painéis com os componentes de cada painel
organizados em layout específico.
A classe JPanel estende JComponent, e JComponent
estende JContainer, então todo JPanel é um Conteiner.
Layouts Complexos
44. Por isto, todo JPanel pode possuir outros componentes,
inclusive outros JPanels com o método add().
O JPanel não tem um painel de conteúdo como um
JFrame. Neste caso, os componentes são inseridos
diretamente no JPanel.
O painel é redimensionado de acordo com as dimensões
dos componentes inseridos nele.
Layouts Complexos
45. Um JText fornece uma área para manipular múltiplas
linhas de texto. É uma subclasse de JComponent.
Um JText não possui eventos de ação. A tecla ENTER
provoca uma quebra de linha dentro do componente.
Um evento externo de outro componente deve ser
utilizado para provocar alguma ação com o conteúdo
do JText.
Áreas de Texto : JText
46. Um JScrollPane fornece barras de rolagem para
componentes.
Um JScrollPane pode utilizar algumas constantes para
definir se e quando as barras de rolagem devem
aparecer.
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
JScrollPane.VERTICAL_SCROLLBAR_NEEDED
JScrollPane.HORIZONTAL_SCROLLBAR_NEEDED
JScrollPane.VERTICAL_SCROLLBAR_NEVER
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
Áreas de Rolagem : JScrollPane
47. Controles deslizantes permitem selecionar a partir de
um intervalo de valores de números inteiros.
Um JSlider horizontal com marcas de medidas e um
marcador que permitem a um usuário selecionar um
valor.
JSliders podem ser personalizados para exibir marcas
de medida principais, marcas de medida secundárias e
rótulos para as marcas de medida.
Os JSliders geram ChangeEvents em resposta a
interações de usuário.
Um objeto de uma classe que implementa a interface
ChangeListener deve declarar o método stateChanged
pode responder a ChangeEvents.
Controle Deslizante : JSlider
48. Um JFrame é uma janela com uma barra de título e
uma borda.
A classe JFrame é uma subclasse de Frame. Frame é
uma subclasse de Window.
Uma janela gerada pelo JFrame é exibida conforme o
padrão de janelas do sistema operacional em uso.
Por padrão, quando o usuário fecha uma janela
JFrame, ela se torna oculta, mas é possível controlar
isto com o método setDefaultCloseOperation().
Janelas : JFrame
49. A interface WindowConstants que a classe JFrame
implementa fornece constantes que podem ser
utilizadas para definir o que deve ser feito com a janela
quando o usuário fechá-la.
DISPOSE_ON_CLOSE (descartada pelo sistema)
DO_NOTHING_ON_CLOSE (o programa decidirá o que deve
ser feito)
HIDE_ON_CLOSE (a janela ficará oculta)
Janelas : JFrame
50. A janela só é exibida quando o método setVisible() é
invocado com o argumento true.
O tamanho da janela pode ser configurado com o
método setSize() e a localização com o setLocation().
Quando a janela é manipulada pelo usuário, alguns
eventos são gerados (WindowEvent).
Os ouvintes de eventos são registrados com o método
addWindowListener.
Janelas : JFrame
51. A interface WindowListener fornece sete métodos para
tratamento dos eventos da janela.
windowActivated : chamado quando o quando o usuário
torna uma janela ativa.
windowClosed : chamado logo depois de a janela ser fechada.
windowClosing: chamado quando o usuário inicia o
fechamento da janela
windowDeactivated: chamado quando o usuário torna outra
janela a janela ativa.
windowDeiconified: chamado quando o usuário restaura a
janela que está minimizada.
windowIconified: chamado quando o usuário minimiza a
janela.
windowOpened: chamado quando um programa exibe uma
janela pela primeira vez.
Janelas : JFrame
52. Os menus permitem que o usuário realiza ações sem
poluir desnecessariamente uma GUI com componentes
extras.
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 declarar menus são:
JMenuBar, JMenu, JMenuITem, JCheckBoxMenuItem,
JRadioButtonMenuItem.
Menus : JMenuBar e JMenu
53. A classe JMenuBar possui métodos para gerenciar uma
barra de menus (conteiner de menus).
A classe JMenu possui métodos para gerenciar menus.
Os menus contém itens de menu e são adicionados a
barras de menus ou a outros menus (submenus).
Quando um menu é clicado, ele se expande para
mostrar sua lista dos itens de menu.
A classe JMenuITem contém os métodos para gerenciar
itens de menu.
Quando um item de menu é selecionado resulta em um
evento de ação.
Menus : JMenuBar e JMenu
54. A classe JCheckBoxMenuItem contém métodos para
gerenciar itens de menu que podem ser ativados ou
desativados.
Uma marca de verificação indica que um item deste tipo
menu foi ativado.
A classe JRadioButtonMenuItem contém métodos
necessários para gerenciar itens de menu que podem
ser ativados ou desativados.
Um círculo aparece para indicar que um item deste tipo de
menu foi ativado.
Menus : JMenuBar e JMenu
55. Alguns aplicativos fornecem menus pop-up sensíveis ao
contexto.
No Swing, esses menus são criados com a classe
JPopupMenu.
Esses menus fornecem opções que são específicas do
componente pelo qual o evento de gatilho pop-up foi
gerado.
Normalmente, o evento de acionamento pop-up ocorre
quando o usuário pressiona e libera o botão direito do
mouse.
Menu de Contexto : JPopupMenu
56. Um programa que utiliza componentes AWT do Java
assume a aparência e o comportamento da plataforma
em que o programa executa.
Às vezes, isto é desejável porque permite que usuários
do aplicativo em cada plataforma utilizem componentes
com os quais eles já estão acostumados.
Com o Swing podemos personalizar a aparência e o
comportamento da interface.
Aparência e Comportamento Plugáveis
57. Muitos aplicativos utilizam uma interface de múltiplos
documentos (Multiple-Document Interface).
Estes aplicativos tem uma janela principal (janela-pai)
e outras janelas (janelas-filhas), para gerenciar vários
documentos abertos e que estão sendo processados em
paralelo.
Um processador de texto e um programa de correio
eletrônico são exemplos de aplicativos MDI.
As classes JDesktopPane e JInternalFrame são
utilizadas para construir interfaces MDI.
Interface de Múltiplos Documentos
58. Um JTabbedFrame organiza componentes GUI em
camadas, das quais somente uma é visível por vez.
Os usuários acessam cada camada via uma guia –
semelhante a pastas em um gabinete de arquivos.
Quando o usuário clica na guia a camada é exibida.
Camadas : JTabbedFrame
59. Este gerenciador (BoxLayout) organiza os componentes
GUI horizontalmente ao longo do eixo x ou
verticalmente ao longo do eixo y de um contêiner.
É semelhante ao GridLayout, mas permite que os
componentes organizados na grade variem em tamanho
e sejam adicionados em qualquer ordem.
Este componente é muito complexo e muito poderoso.
Vale a pena consultar a documentação para aprender
de forma objetiva a utilização deste gerenciador.
O GridBagConstraints especifica como um componente
é inserido em um GridBagLayout.
Gerenciador BoxLayout