JFC e Swing Interface com o Usuário JFC e Swing n JFC Java Foundation Classconjunto de classes empregadas para implementar a interface com o usuário. n A API Swing foi incluída na versão 2 da plataforma Java,Java Paltaform Standard Edition (J2SETM), desda versão inicial (1.2). Top-Level Containers 1
General-Purpose Containers Special-Purpose Containers Controles Básicos 2
Informações não Editáveis Displays Interativos AloMundoSwing.java import javax.swing.*; public class AloMundoSwing { /** * Cria a GUI e a apresenta. */ private static void createandshowgui() { //Estabelece a decoração e look and feel. JFrame.setDefaultLookAndFeelDecorated(true); //Cria a janela com título. JFrame frame = new JFrame( AloMundoSwing"); frame.setdefaultcloseoperation(jframe.exit_on_close); //Adiciona o Label Alô Mundo!!!". JLabel label = new JLabel( Alô Mundo!!!"); frame.getcontentpane().add(label); 3
AloMundoSwing.java } //Apresenta a Janela. frame.pack(); frame.setvisible(true); } public static void main(string[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.swingutilities.invokelater(new Runnable(){ public void run() { createandshowgui(); } }); } Importando Pacotes n A primeira linha importa o pacote swing: import javax.swing.*; n A maioria dos programas Swing também necessitam importar 2 pacotes AWT: import java.awt.*; import java.awt.event.*; Exemplo 1 n AloMundowing.java Neste exemplo o container é do tipo JFrame. Para criar e apresentar a janela é empregado o código abaixo: JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame( AloMundoSwing");... frame.pack(); frame.setvisible(true); 4
JLabel n Exceto os top-level containers, tais como JFrame, todos os componentes Swing são derivados de JComponent. n JLabel é um componente Swing que apresenta um texto. JLabel label = new JLabel( Alô Mundo!!!"); frame.getcontentpane().add(label); Adicionando componentes n Note que o componente JLabel não foi adicionado ao frame. n Todo top-level container tem um content pane que contem, direta ou indiretamente, todos os componentes visíveis (exceto os menus e as decorações das janelas). Container n Todo programa swing deve ter pelo menos um top-level container. n Esta janela principal é geralmente do tipo JFrame, JDialog, ou (para applets) JApplet. JFrame implementa uma janela principal JDialog implementa uma janela secundária JApplet implementa uma área de apresentação numa janela de um browser 5
Exemplo de Container Content Panel n Todo top-level container tem um panel onde são inseridos os controles. n Para adicionarmos um controle ao panel no exemplo 1 fizemos: frame.getcontentpane().add(label); Estrutura de Camadas 6
JRootPane n Em geral, não é criado diretamente um JRootPane. n É criado quando é instânciado um JInternalFrame ou um dos conainers do Swing, tais como JApplet, JDialog ou JFrame. JRootPane n Glass Pane Não é visível por default. Funciona como um vidro sobre todas as outras partes. n Layered Pane Posiciona os componentes, o content pane e o menu bar. n Content Pane É o container dos componentes visíveis do root pane. n Menu Bar (opcional) Onde fica a barra de menu. Fechando a janela n Para fechar o programa o botão fechar é clicado e o código abaixo faz o tratamento necessário para fechar o programa: frame.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); 7
Colocando tudo para rodar javax.swing.swingutilities.invokelater( new Runnable() { public void run() { /* create and show the GUI */ createandshowgui(); } }); Exemplo 2 n LookAndFeel.java Este exemplo ilustra: n Look and Feel n Instanciando Botões e Labels n Adicionando componentes n Colocando Bordas n Tratando Eventos JFrame n Uma instância da classe JFrame é uma janela típica com borda, título e ícones para fechar, maximizar e minimizar. Programa com GUI normalmente usam uma instância de JFrame. n Para fazer uma janela que apareça dentro de outra usa-se a classe JInternalFrame. 8
JFrame //1. Opcional: Especifica o Look and Feel. JFrame.setDefaultLookAndFeelDecorated(true); //2. Cria o frame. JFrame frame = new JFrame("FrameDemo"); //3. Opcional: O que acontece ao fechar frame.setdefaultcloseoperation(jframe.exit_on_close); //4. Cria os componentes e os coloca frame.getcontentpane().add(emptylabel, BorderLayout.CENTER); //5. Arruma o frame. frame.pack(); //6. Apresenta frame.setvisible(true); Tamanho e Posição n void pack() - Cria a janela num tamanho que possa conter todos os controles. n void setsize(...),dimension getsize() - Set ou get o tamanho da janela. n void setbounds(...),rectangle getbounds() - Set ou get o tamanho e posição da janela. n void setlocation(...), Point getlocation() - Set ou get a localização do canto superior esquerdo da janela. n void setlocationrelativeto(component) - Posição da janela centralizada sobre o componente especificado. Se o parâmetro for null é centralizada na tela. Framework.java 9
Look and Feel Java Look and Feel GTK+ Look and Feel Windows Look and Feel MacOS Look and Feel Look and Feel n Para configurar o comportamento foi usado o código: String lookandfeel = null;... lookandfeel = UIManager.getCrossPlatformLookAndFeelClassName();... try { UIManager.setLookAndFeel(lookAndFeel); } catch (Exception e) { }... // Create and show the GUI.. Look and Feel n Para o tratamento do evento ActionListener associado ao botão: button.addactionlistener( // cria a classe anônima new ActionListener(){ public void actionperformed(actionevent e) { numclicks++; label.settext(labelprefix + numclicks); initlookandfeel(); } }); 10
Look and Feel n Método initlookandfeel muda a aparência em função do número de cliks. private static void initlookandfeel(){ switch( numclicks % 4){ case 0: lookandfeel = "com.sun.java.swing.plaf.motif.motiflookandfeel"; break;... Labels n Através da classe JLabel, textos e imagens podem ser exibidos. n Se o componente é interativo e possui estados, deve ser empregada a classe JButton. n Ao ser utilizado código HTML como texto em um JLabel é possível: ter linhas múltiplas, fontes diferentes, várias cores, etc. Instanciando Labels n Abaixo apresentamos um código para instanciarmos um label:... // declarando as variáveis private static String labelprefix = "Number of button clicks: "; private int numclicks = 0;...// código de iniciação: final JLabel label = new JLabel(labelPrefix + "0 ");... label.setlabelfor(button);... // no tratamento de evento atualiza os clicks: label.settext(labelprefix + numclicks); 11
Botões n Swing utiliza a classe JButton para implementar botões. n JButton, assim como JLabels, pode apresentar tanto texto quanto imagens. n A letra sublinhada é uma atalho para o botão, sendo especificado pelo método setmnemonic. n Toda vez que um botão é clicado um evento ActionEvent é disparado. Instanciando Botões n Abaixo é apresentado um código para instanciar um botão: JButton button = new JButton( "I'm a Swing button!"); button.setmnemonic('i'); button.addactionlistener( /*...create an action listener...*/); Adicionando Componentes n Neste segundo exemplo os controles são agrupados em um painel (JPanel). Criamos o panel e estabelecemos o layout com uma única coluna: JPanel panel = new JPanel( new GridLayout(0,1)); Depois adicionamos os componentes: panel.add(button); panel.add(label); 12
Colocando Bordas n Este é o código que estabelece a borda: pane.setborder( BorderFactory.createEmptyBorder( 30, //top 30, //left 10, //bottom 30) //right ); Tratando Eventos n Toda vez que o usuário digita uma tecla ou clica o mouse um evento é gerado. n Um objeto pode ser notificado de um evento, para tal deve: Implementar a interface apropriada; e ser registrado como um event listener no event source apropriado. Tratando Eventos public class SwingApplication {... JButton button = new JButton("I'm a Swing button!"); button.addactionlistener( new ActionListener(){ public void actionperformed(actionevent e) { numclicks++; label.settext(labelprefix + numclicks); initlookandfeel(); } }); } 13
Tratando Eventos n Todo event handler necessita: Na declaração da classe event handler, a especificação que a classe implements uma interface listener ou extends uma classe que implementa uma interface listener. Registrar uma instância da classe event handler como um listener em um ou mais componentes. A classe event handler deve tem o código que implementa os métodos da interface listener. Tratando Eventos n Geralmente, para tratar o click do mouse deve ser implementada a interface ActionListener. Event Listners Some Events and Their Associated Event Listeners Act that Results in the Event User clicks a button, presses Enter while typing in a text field, or chooses a menu item User closes a frame (main window) User presses a mouse button while the cursor is over a component User moves the mouse over a component Component becomes visible Component gets the keyboard focus Table or list selection changes Any property in a component changes such as the text on a label Listener Type ActionListener WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener PropertyChangeListener 14
Exemplo 3 n CelsiusConverter.java Uso do JTextField Conversão JTextField n Este componente é um controle básico de texto que permite ao usuário entrar com um texto de uma linha. n Quando o usuário termina a edição (pressionando <Enter>) é lançado um evento. n Caso seja necessária mais de uma linha de edição deve ser usado o componente JTextArea. Instanciando JTextField n O código abaixo instancia um componente JTextField no exemplo 3: JTextField tempcelsius = null;... tempcelsius = new JTextField(5); n O parâmetro inteiro 5 no construtor define o número de colunas do campo. Este número é usado para calcular o comprimento do componente usado pelo layout manager. n Este número não limita quantos caracteres podem ser usados no componente. 15
Convertendo o valor n Para converter o valor digitado é criado um event hendler do tipo ActionListner para o click no botão ou para o <Enter> no JTextField. converttemp.addactionlistener(this); tempcelsius.addactionlistener(this);... public void actionperformed(actionevent event){ // Parse degrees Celsius as a double and // convert to Fahrenheit. int tempfahr = (int)((double.parsedouble(tempcelsius.gettext())) * 1.8 + 32); fahrenheitlabel.settext(tempfahr + " Fahrenheit"); } JTextArea n A classe JTextArea permite serem apresentados textos com múltiplas linhas e, opcionalmente, o usuário editar o texto. n Se o texto a ser apresentado for contante e não for editado pelo usuário deve ser empregada a classe JLabel. textarea = new JTextArea(5, 20); JScrollPane scrollpane = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); textarea.seteditable seteditable(false); JTextArea n Sem a criação dos scroll pane, o JTextArea não irá permitir rolar o texto. A classe JScrollPane é empregada para isso, como no exmeplo apresentado. n Por padrão, JTextAreas são editáveis. O método seteditable(false) desbilita a edição. n Para adicionar texto ao objeto JTextArea empregase o método: private final static String newline = "\n";... textarea.append(text + newline); 16
JPasswordField n A classe JPasswordField é uma classe derivada de JTextField especializada para password. n O que for digitado, por razões de segurança, é substituído por um outro caracter tal como *, por exemplo. n O valor digitado é armazenado como um array de caracteres ao invés de uma String. passwordfield = new JPasswordField(10); passwordfield.setactioncommand(ok); passwordfield.addactionlistener(this);... char[] input = passwordfield.getpassword getpassword(); JPasswordField JButton n Um botão Swing pode apresentar tanto texto quanto imagens. n A letra sublinhada é um atalho e é especificada através do método setmnemonic(keyevent.vk_d). n Quando um botão está desabilitado o look and feel gera o aparência correspondente. n Geralmente a resposta ao click é implementada através do action listener. 17
Botão Default n O top-level container só pode ter um botão default (aquele que tem a aparência destacada e atende ao pressionar da tecla <Enter>). n Para definir o botão converttemp para default: converterframe.getrootpane(). setdefaultbutton(converttemp); Exemplo 4 n LunarPhases.java Layout Managers Compound Borders ComboBox Multiple Images Criando os Panels //Cria e apresenta os paineis phase selection e display. selectpanel = new JPanel(); displaypanel = new JPanel(); //Adiciona varios widgets aos sub panels. addwidgets(); //Cria o main panel que contem os dois sub panels. mainpanel = new JPanel(); mainpanel.setlayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); mainpanel.setborder(borderfactory.createemptyborder( 5,5,5,5)); //Adiciona os paineis select e display ao main panel. mainpanel.add(selectpanel); mainpanel.add(displaypanel); 18
Usando Layout Managers n A única hora que devemos nos preocupar com o layout manager é na instanciação do panel: JPanel pane = new JPanel( new BorderLayout()); n Ou por exemplo para o content panel: Container contentpane = frame.getcontentpane(); contentpane.setlayout(new FlowLayout()); Compound Borders n Uma compound border consiste de uma borda com título e uma borda vazia (para adicionar um espaço extra), como na figura abaixo: Compound Borders n O código para adicionar a compound border: // Add border around the select panel // selectpanel. setborder(borderfactory.createcompoundborder( BorderFactory.createTitledBorder( "Select Phase"), BorderFactory.createEmptyBorder(5,5,5,5)) ); 19
ComboBox n Uma combo box permite escolher uma opção de uma lista. n JComboBox pode permitir a edição ou não do texto. A forma default não permite a edição. n A combo box pode ser iniciada com um array de strings, no nosso exemplo fases da lua. n Também pode ser iniciado com um array de ícones ou com um vetor ou estrutura de dados. n O método setselectedindex especifica qual o valor incial a ser apresentado. ComboBox JComboBox phasechoices = null;... //Cria a combo box com as fases lunares. String[] phases = { "New", "Waxing Crescent", "First Quarter", "Waxing Gibbous", "Full", "Waning Gibbous", "Third Quarter", "Waning Crescent" }; phasechoices = new JComboBox(phases); phasechoices.setselectedindex( START_INDEX); Eventos com ComboBox n A combo box dispara um evento do tipo ActionListener quando o usuário seleciona um item. phasechoices.addactionlistener(this);... public void actionperformed(actionevent event) { if("comboboxchanged".equals(event.getactioncommand())){ //Update the icon to display the new phase phaseiconlabel.seticon( images[phasechoices.getselectedindex()]); } } 20
Multiple Images final static int NUM_IMAGES = 8; final static int START_INDEX = 3; ImageIcon[] images = new ImageIcon[NUM_IMAGES];... //Carrega as imagens. for (int i = 0; i < NUM_IMAGES; i++) { String imagename = "images/image" + i + ".jpg"; System.out.println("getting image: " + imagename); URL iconurl = LunarPhases.class.getResource(imageName); ImageIcon icon = new ImageIcon(iconURL); images[i] = icon; } Usando Layout Manager n O Java possui 7 layout managers: BorderLayout; BoxLayout; CardLayout; FlowLayout; GridBagLayout; GridLayout; e SpringLayout. Layouts 21
O que é Layout Manager? n O layout manager é um objeto que determina o tamanho e a posição dos componentes em um container. n Os componentes podem possuir atributos de tamanho e posição, mas a palavra final é do layout manager. n Cada objeto JPanel é inicializado com FlowLayout, a não ser que seja especificado outro. n O content pane usa o BorderLayout como default. Alterando o Layout Manager n Para alterar o layout manager de um JPanel, este pode ser especificado aundo o painel é instanciado: JPanel panel = new JPanel(new BorderLayout()); n Uma vez criado o container, o layout manager do content panel pode ser alterado através do método setlayout: Container contentpane = frame.getcontentpane(); contentpane.setlayout(new FlowLayout()); Adicionando Componentes n Há diferentes maneiras de se especificar como adicionar componentes ao JPanel, em função do tipo de layout manager. n Muitos layout managers simplificam isto adicionando os componentes baseados na ordem que são adicionados ao container. 22
Dimensões e Posição n Podem ser informadas as dimensões máximas e mínimas do controle, uma vez adicionado, através dos métodos: setminimumsize, setpreferredsize, e setmaximumsize. n Muitos layout managers não levam estes valores em conta, mas o BoxLayout e o SpringLayout sim. Alinhamento n Podem ser dadas informações sobre o alinhamento através dos métodos dos componentes: setalignmentx, e setalignmenty. n Ou sobrecarregando os métodos: getalignmentx, e getalignmenty. n Só o BoxLayout atende a estes métodos. Colocando Espaço n Três fatores influenciam no espaçamento dos componentes em um container: o layout manager; componentes invisíveis; ou bordas vazias. 23
Orientação n O atributo componentorientation permite que seja estabelecida a orientação de um componente, diferente da padrão esquerda para direita e cima para baixo. n Isto pode ser feito através dos métodos: setcomponentorientation; applycomponentorientation. n Os argumentos para estes métodos podem ser: ComponentOrientation.RIGHT_TO_LEFT, ou o método: ComponentOrientation.getOrientation getorientation(locale). Escolhendo o Layout Manager n Caso seja necessário apresentar um componente ocupando o máximo de espaço possível: se for um único componente use GridLayout ou BorderLayout. Caso contrário use BorderLayout ou GridBagLayout. Escolhendo o Layout Manager n Caso seja necessário apresentar alguns componentes em uma linha em tamanho natural. Use o JPanel para agrupar os compontes e o FlowLayout ou o BoxLayout. O SpringLayout também pode ser uma boa opção. 24
Escolhendo o Layout Manager n Caso seja necessário apresentar alguns componentes do mesmo tamanho em uma matriz: GridLayout. n Caso seja necessário apresentar alguns componentes em uma linha ou coluna, com espaçamento variável: BoxLayout. Escolhendo o Layout Manager n Caso seja necessário apresentar alguns componentes em colunas alinhadas, como em formulários onde os títulos dos campos estão numa coluna e os campos de edição estão na próxima coluna: SpringLayout. n A classe SpringUtilities define o método makecompactgrid que permite facilmente alinhar múltiplas colunas e linhas de componentes. Escolhendo o Layout Manager n Caso seja necessário apresentar componentes em um layout complexo temse: GridBagLayout, e SpringLayout. n Outra opção é agrupar os componentes em um ou mais JPanel. Com esta abordagem cada JPanel pode empregar um layout manager diferente. 25
BorderLayout n O BorderLayout tem 5 áreas especificadas pelas constantes: PAGE_START, PAGE_END, LINE_START, LINE_END, e CENTER. BorderLayout n Ao aumentar a janela, a área central ocupa grande parte do espaço disponível. n Geralmente são usadas apenas uma ou duas das áreas do BorderLayout só o centro (center), ou o center e o bottom. n No próximo slide será apresentado um exemplo usando o content pane. Como o content pane usa o BorderLayout por default, não foi necessário estabelecer o layout manager. Border Layout...// Container pane = aframe.getcontentpane()... JButton button = new JButton("Button 1 (PAGE_START)"); pane.add(button, BorderLayout.PAGE_START); // Faz o componente central grande como é típico // para o BorderLayout. button = new JButton("Button 2 (CENTER)"); button.setpreferredsize(new Dimension(200, 100)); pane.add(button, BorderLayout.CENTER); button = new JButton("Button 3 (LINE_START)"); pane.add(button, BorderLayout.LINE_START); button = new JButton("Long-Named Button 4 (PAGE_END)"); pane.add(button, BorderLayout.PAGE_END); button = new JButton("5 (LINE_END)"); pane.add(button, BorderLayout.LINE_END); 26
BorderLayout n O BorderLayout não coloca nenhum espaço entre os componentes. n Um espaço (gap) pode ser especificado (em pixels) através do construtor: BorderLayout(int horizontalgap, int verticalgap) n Também podem ser usados os métodos abaixo para especificar os gap hoprizontais e verticais, respecticvamente: void sethgap(int) void setvgap(int) BoxLayout n O BoxLayout empilha os componentes uns sobre os outros ou os enfileira. BoxLayout n O BoxLayout, quando em pilha, tenta posicionar os controles com a altura especificada. n Caso não haja espaço suficiente, serão ajustadas as alturas de cada componente. n Pode ser que não seja possível o correto posicionamento dos controles, uma vez que o BoxLayout respeita os valores mínimos e máximos de altura atribuídos aos controles. 27
CardLayout n O CardLayout auxilia a posicionar 2 ou mais componentes (geralmente instancias de JPanel). n É necessário permitir que o usuário escolha o componente, para tal podem ser usadas combo box ou tabbed pane, por exemplo. CardLayout CardLayoutDemo.java TabDemo.java FlowLayout n O FlowLayout posiciona os componentes em uma linha com os tamanhos por eles definidos e é o padrão para a classe JPanel. n Se o espaço horizontal não for suficiente são usadas várias linhas. n Se o espaço for maior que o necessário, por padrão, os controles são centralizados horizontalmente. n Pode ser especificado que o alinhamento seja a esquerda ou a direita, através do construtor, bem como especificar o espaçamento ao redor dos componentes. 28
FlowLayout contentpane.setlayout(new FlowLayout()); contentpane.add(new JButton("Button 1")); contentpane.add(new JButton("Button 2")); contentpane.add(new JButton("Button 3")); contentpane.add(new JButton( "Long-Named Button 4")); contentpane.add(new JButton("5")); GridLayout n O GridLayout posiciona os em uma grade. componentes n Cada componente ocupa completamente uma célula da grade e cada célula tem exatamente o mesmo tamanho. n Se o tamanho do container (a janela) for alterado o tamanho das células e dos componentes também é feito. GridLayout pane.setlayout(new GridLayout(0,2)); pane.add(new JButton("Button 1")); pane.add(new JButton("Button 2")); pane.add(new JButton("Button 3")); pane.add(new JButton("Long-Named Button 4")); pane.add(new JButton("5")); 29
GridBagLayout n GridBagLayout é um dos mais flexíveis e complexos dos layout managers. n Os componentes são posicionados em uma grade, permitindo que estes ocupem mais de uma célula. n As linhas não precisam ter a mesma altura e as colunas não necessitam ter a mesma largura. n Essencialmente, posiciona os componentes, com os seus tamanhos pré-definidos, em células de uma grade. A partir da dimensão dos componentes determina o tamanho das células. GridBagConstraints n Um código típico para usar o GRidBagLayout seria: JPanel pane = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); //Para cada componente a ser adicionado: //...Cria o componente... //...Atribui valores para a intancia do // GridBagConstraints... pane.add(thecomponent, c); GridBagConstriants JButton button; pane.setlayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.HORIZONTAL;... button = new JButton("5"); c.ipady = 0; //reset para o default c.weighty = 1.0; //coloca um espaço extra vertical c.anchor = GridBagConstraints.PAGE_END; // bottom of space c.insets = new Insets(10,0,0,0); //espaço no topo c.gridx = 1; //alinhamento com button 2 c.gridwidth = 2; //lagura de 2 colunas c.gridy = 2; //terceira linha pane.add(button, c); 30
GridBagConstriants n n gridx, gridy Especifica a linha e coluna do canto superior esquerdo do componente. Recomenda-se que seja especificado para cada componente. gridwidth, gridheight Especifica o número de colunas (gridwidth) e linhas (gridheight), especifica o número de células que o componente usa, não o número de pixels. O valor default é 1. Note: o GridBagLayout só permite que sejam usadas mais de uma linha pelo componente que estiver na coluna mais a esquerda ou se for especificado valores positivos para gridx e gridy. n GridBagConstriants fill Usado quando o componente é menor que a área alocada definindo como proceder para redimensionar o componente. Valores válidos (constantes GridBagConstraints): NONE (default), HORIZONTAL, VERTICAL, e BOTH. n ipadx, ipady Especifica o espaçamento interno. Quanto deve ser adicionado ao tamanho do componente. O valor default é zero. n insets Especifica o espaçamento externo, o espaço mínimo entre os componentes. O default é zero. GridBagConstriants n anchor Usado quando o componente é menor que a área e determina onde colocar o componnte. Valores válidos (constantes GridBagConstraints): CENTER (default), PAGE_START START, PAGE_END END, LINE_START START, LINE_END END, FIRST_LINE LINE_START, FIRST_LINE_END, LAST_LINE LINE_END, e LAST_LINE LINE_START. ------------------------------------------------- FIRST_LINE_START PAGE_START FIRST_LINE_END LINE_START CENTER LINE_END LAST_LINE_START PAGE_END LAST_LINE_END ------------------------------------------------- 31
GridBagConstriants n weightx, weighty Weights são usados para determinar como distribuir o espaço pelas colunas (weightx) e pelas linhas (weighty); é importante para o comportamento de redimensionamento. Se não for especificado nenhum valor diferente de zero, todos os componentes são colocados no centro da célula. GridBagLayout n Caso seja aumentada a janela do exemplo, pode-se notar que o botão 5 fica com todoo espaço vertical extra. n O novo espaço horizontal é dividido com as outras colunas. n Este comportamento é função dos weights que o programa estabeleceu para este componente. GridBagLayout 32
SpringLayout n O Springlayouts define relações entre as arestas dos componentes, por exemplo, define que a aresta esquerda de um componente fica a uma distância fixa da aresta direita de um outro componente. n Como padrão define a altura e largura de um componente (a distância entre as arestas superior e inferior, e entre as arestas esquerda e direita) para ser algo entre os valores máximos e mínimos, e, se possível, o preferred do componente. n A distância entre as arestas é representad por objetos Spring. Cada spring tem 4 atributos: minimum, preferred, maximum e o atual. n Os springs associados a cada componente são agrupados no objeto SpringLayout.Constraints Constraints. LunarPhases.java n Este exemplo possui 3 paineis (panels) Exemplo 5 n VoteDialog.java Radio Buttons Dialogs 33
Radio Button n Radio buttons são um conjunto de opções agrupadas onde apenas uma opção pode ser escolhida. n Swing implementa radio buttons através das classes JRadioButton e ButtonGroup classes. n Para colocar um radio button num menu, emprega-se a classe JRadioButtonMenuItem. Radio Button n Toda vez que um JRadioButton é clicado são gerados os eventos: ActionEvent; e um ou dois ItemEvent (um do que foi selecionado e outro do que perdeu a seleção). n Para cada grupo de radio buttons, é necessário criar uma instância de ButtonGroup e adicionar cada radio button a ela. JRadioButton e JButtonGroup n Para cada grupo de radio buttons, é necessário um JButtonGroup e adicionar cada JRadioButton a ele. n JButtonGroup são responsáveis por liberar o radio button quando o usuário seleciona uma outra opção no grupo. 34
JRadioButton e JButtonGroup final int numbuttons = 4; JRadioButton[] radiobuttons = new JRadioButton[numButtons]; final ButtonGroup group = new ButtonGroup();... final String defaultmessagecommand = "default"; final String yesnocommand = "yesno"; final String yeahnahcommand = "yeahnah"; final String ynccommand = "ync"; radiobuttons[0] = new JRadioButton("<html>Candidate 1: <font color=red>sparky the Dog</font></html>"); radiobuttons[0].setactioncommand(defaultmessagecommand); JRadioButton e JButtonGroup radiobuttons[1] = new JRadioButton("<html>Candidate 2: <font color=green>shady Sadie</font></html>"); radiobuttons[1].setactioncommand(yesnocommand); radiobuttons[2] = new JRadioButton("<html>Candidate 3: <font color=blue>r.i.p. McDaniels</font></html>"); radiobuttons[2].setactioncommand(yeahnahcommand); radiobuttons[3] = new JRadioButton("<html>Candidate 4: <font color=maroon>duke the Java<font size=-2> <sup>tm</sup> </font size> Platform ascot</font></html>"); radiobuttons[3].setactioncommand(ynccommand); for (int i = 0; i < numbuttons; i++) { group.add(radiobuttons[i]); } //Select the first button by default. radiobuttons[0].setselected(true); Dialogs n Para criar uma janela de diálogo simples, usa-se a classe JOptionPane. n Toda janela de diálogo é dependente de um Frame. 35
JOptionPane n Para apresentar uma janela de mensagem simples com JOptionPane: JOptionPane.showMessageDialog( frame, "There's no \"there\" there."); 36