Interfaces Gracas em Java Sumario I SWING generalidades I Componentes e Contentores I Modelo de eventos I Gestores de Colocac~ao I Componentes e Contentores com exemplos Rui Camacho
Bibliograa I The Java Tutorial, Trail: Creating a GUI with JFC/Swing I \Java How to Program", Deitel & Deitel, (captulo 12) I The Java API
Sugest~oes para estudar/praticar I http://developer.java.sun.com/developer/onlinetraining/ I ver os exemplos que v^em com o JDK (directorio demo) I ver exemplos (downloadable) do livro de Deitel & Deitel
Java Foundation Classes (JFC) conjunto de APIs na tentativa de tornar o Java uma linguagem para aplicac~oes empresarais completas JFC e composta por 5 APIs: I AWT I Java 2D I Acessibilidade I Drag and Drop I Swing AWT Abstract Windowing Toolkit
Swing resumo I Widgets do Swing extendem os do AWT I O modelo de eventos do AWT continua a ser usado I Baseado em Componentes (e Contentores) I suporta os componentes do AWT mais outros (ex JComponent) I Drag and Drop Support - troca de informac~ao entre aplicac~oes noutra API do JFC I Utiliza componentes lightweight (n~ao dependentes de componentes nativos) I Utiliza uma variante da arquitectura Model View Controller (MVC) I Tem Pluggable Look And Feel (PLAF) - visual das janelas conguravel I Utiliza o Delegation Event Model
Porqu^e Swing I AWT n~ao e sucientemente funcional para aplicac~oes industriais a biblioteca de widgets e pequena os widgets so disp~oem de funcionalidades basicas extens~oes s~ao habitualmente necessarias I componentes AWT dependem de componentes correspondentes nativos I widgets n~ao t^em exactamente o mesmo comportamento em diferentes plataformas AWT { Abstract Windowing Toolkit Rui Camacho
Pacotes importantes I javax.swing - new GUI tools com novos componentes... I javax.border - classes para desenhar contornos nos componentes I javax.swing.colorchooser - classes para escolha de cores I javax.swing.event - classe para novos modelos de eventos I javax.swing.lechooser - classes para escolha de cheiros I javax.swing.plaf.* - classes for the Pluggable Look and Feel I javax.swing.text - manipulac~ao de texto I... I javax.accessibility - for disabled-persons accessibility
Componente uteis
Componentes Heavyweight I Usados pelo AWT I Rectangulares I Opacos I S~ao sempre desenhados em cima de componentes lightweight I Dependem de congeneres nativos I Look and Feel depedente do sistema operativo (SO) I funcionalidade determinada pelo SO I mais rapidos porque o SO realiza o trabalho
Componentes Lightweight I Podem ter partes transparentes I Podem tomar qualquer forma I Podem-se sobrep^or entre eles I Eventos do rato ocorrem atraves das partes transparentes I N~ao depedem de congeneres nativos I Look and Feel desenhado em tempo de execuc~ao pelo que funcionalidades s~ao o mesmo em todas as plataformas. Mais lento por que o Java tem que fazer o trabalho.
Interface Graca basica import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TestaJFramef g public static void main(string s[])f JFrame frame = new JFrame("Exemplo de JFrame"); Container c = frame.getcontentpane(); c.setbackground( Color.yellow ); c.add(new JButton(\botao"), BorderLayout.SOUTH); c.add(new JLabel(\Frase para o JLabel")); frame.addwindowlistener( new WindowAdapter() f // listener para terminar qd fecha janela public void windowclosing(windowevent event)f System.exit(0);g g ); frame.setsize(400,400); frame.show(); g Rui Camacho
Resultado da Interface Graca basica
I Contentores de topo - onde os outros componentes se desenham JFrame, JDialog, JApplet I Contentores Intermedios- facilitam arranjo de outros JPanel, JScrollPane, JTabbedPane I Componentes atomicos - apresentam informac~ao JButton, JComboBox, JTextField, Jtable I Criac~ao de Componentes I criac~ao do objecto I alterac~ao dos atributos I (para contentores) associac~ao de um gestor de colocac~oes (Layout Manager) I associac~ao de um gestor de eventos e programac~ao de comportamentos I (se n~ao e contentor de topo) adicionar a um contentor Rui Camacho Elementos da Interface Graca
do tutorial: http://developer.java.sun.com/developer/onlinetraining/gui/swing1/ Rui Camacho Swing hierarquia de componentes (semelhantes aos de AWT)
do tutorial: http://developer.java.sun.com/developer/onlinetraining/gui/swing1/ Rui Camacho Swing hierarquia de componentes \novos"
Hierarquia de componentes comuns do Swing java.lang.object " java.awt.component " java.awt.container " javax.swing. JComponent
Model / View / Controller Elementos independentes: I Model I dados de estado para cada componente I dados diferentes para modelos diferentes I View I \visual" do componente no ecr~a I Controller I como o componente reage a eventos
Comunicac~ao em MVC
Exemplo de MVC
MVC em Java I Swing usa o model-delegate design, uma arquitectura semelhante ao MVC. I O View e Controller s~ao combinados no UI delegate uma vez que o Java trata a maioria do seventos como o AWT. I Multiplas views podem ser usados com um unico modelo. I Mudancas num unico modelo podem afectar varias views. I Os componentes podem partilhar um modelo (JScrollbar e JSlider partilham o BoundedRangeModel).
MVC em Java
Swing Eventos I EventObject I objecto com informac~ao sobre evento (inclui id fonte) I fontes de eventos: componentes I Object getsource() Returns the object that red the event I Tipos de eventos I eventos de baixo nvel I ex: eventos do rato e do teclado, resultados de entradas do utilizador I eventos sem^anticos I ex: eventos de acc~ao e de selecc~ao, com denic~ao dependente do componente I Tratamento: dirigido pelos eventos sem^anticos I independentes da plataforma e do "look and feel" I independentes da composic~ao do objecto gerador Rui Camacho
Tratar Eventos I Tratar eventos I associar atendedores as fontes de eventos I cada fonte pode ter varios atendedores I cada atendedor pode tratar eventos de varias fontes I Usar um atendedor de eventos I denir classe que implementa um Listener ou extende classe que o implementa I public class UmaClasse implements ActionListener f... I Registar uma inst^ancia do gestor como atendedor de um ou mais componentes I umcomponente.addactionlistener(instanciadeumaclasse) I escrever codigo para os metodos da interface do Listener I public void actionperformed(actionevent e) f...
do livro Deitel & Deitel Rui Camacho Registar um Event handler
Atendedores de Eventos I Cada tipo de atendedor tem uma interface denida I interface tem metodos para todos os eventos que o atendedor pode tratar I atendedor especco tem de implementar todos os metodos I metodos para eventos irrelevantes podem ter corpo vazio I em vez de usar interface: usar adaptador I classe que implementa a interface e fornece metodos por omiss~ao I subclasse desta so tem de denir os metodos a que quer dar conteudo proprio
Atendedores de Eventos I Classe do atendedor pode ser interna I classe interna tem acesso a atributos privados da classe I no exemplo: class QuitListener implements ActionListener f I Classe do atendedor pode ser anonima I desnecessario criar nome para classe que se dene para criar 1 so inst^ancia I no exemplo: combo.addactionlistener( new ActionListener () f public void actionperformed(actionevent e) f...gg)
Exemplos de Atendedores // classes embutidas ("nested") class QuitListener implements ActionListener f public void actionperformed(actionevent e) f System.exit(0); g g class ClickListener implements ActionListener f public void actionperformed(actionevent e) f numclicks++; etiqueta.settext(labelprex + numclicks); g g
Delegation Event Model o Swing e baseado no Delegation Event Model do JDK 1.1 I No JDK 1.0 so as classes dos componentes t^em metodos para tratar eventos, e por isso nenhum outro objecto pode tratar eventos. I Metodos de tratamento e eventos de componentes s~ao sbstituidos por interfaces de event listener classes de adaptac~ao I Qualquer classe pode usar listener interfaces ou adapter classes.
Modelo de eventos do JDK 1.0 I programas t^em que extender os componentes GUI e sobrep^or action() ou handleevent() I s~ao necessarias muitas classes I eventos s~ao propagados pela hierarquia acima do GUI ate serem consumidos ou atingirem a raiz I eventos para a hierarquia podem ser tratados por um container (e necessario uma instruc~ao condicional complexa)
Problemas com o modelo de eventos do JDK 1.0 I extender a classe de um componente sem mudar nada e redundante e enfadonho I n~ao e possvel separar o modelo da aplicac~ao do GUI (n~ao ha MVC) I complicado processar tipos diferentes de eventos uma vez que os eventos s~ao tratados pelos mesmos metodos I events s~ao entregues aos componentes quer os componentes os processem ou n~ao
JDK 1.1 Event Listeners I objectos que implementam uma interface EventListener especca por extens~ao do generico java.util.eventlistener I dene os metodos que pode ser invocados pela fonte de eventos em resposta a cada tipo de evento especco tratado pela interface
I Baixo nvel I java.awt.event.focusevent (componente recebeu focus, perda de focus) Rui Camacho I entrada de baixo nvel ou uma ocorr^encia janela-sistema num componente visual no ecr~a I java.awt.event.componentevent (redimensionamento de componente, movido, etc.) I java.awt.event.keyevent (componente recebeu key-press, key-release, etc.) I java.awt.event.mouseevent (componente recebeu mouse-down, mouse-move, etc.)
Tipos de Eventos I Sem^anticos I relacionados com a sem^antica do modelo de componentes de uma interface com o utilizador I java.awt.event.actionevent ("executa comando") I java.awt.event.adjustmentevent ("valor do componente ajustado") I java.awt.event.itemevent ("estado de um item modou") I java.awt.event.textevent ("o valor do texto mudou")
Fontes de Eventos I Multiplos atendedores de eventos podem ser atribuidos a uma fonte (ordem n~ao e garantida) I Baixo nvel I java.awt.component I addcomponentlistener ( ComponentListener l) I addmouselistener ( MouseListener l) I addmousemotionlistener ( MouseMotionListener l) I Sem^antico I java.awt.list I addactionlistener ( ActionListener l) I additemlistener ( ActionListener l)
Classes de Adaptadores Estas podem ser extendidads em vez de se usar interfaces, quando o interface tem muitos metodos n~ao usados (ex: MouseMotionListener). As classes Adapter: I java.awt.event.componentadapter I java.awt.event.containeradapter I java.awt.event.focusadapter I java.awt.event.keyadapter I java.awt.event.mouseadapter I java.awt.event.mousemotionadapter I java.awt.event.windowadapter
Layout Managers I arranjam os widgets de acordo com um padr~ao I podem actualizar os contentores para suportar redimensionamento do contentor ou componentes internos I tornam possvel a elaborac~ao de UIs complexos
Swing Gestor de Colocac~ao I Determina o arranjo dos componentes I tamanho e posic~ao dos componentes nos contentores I Variantes de Gestor: I BorderLayout, BoxLayout, FlowLayout, GridBagLayout, GridLayout, CardLayout NORTH I BorderLayout WETS CENTER EAST SOUTH I BoxLayout: componentes em linha I FlowLayout: componentes por ordem em linhas I GridLayout: componentes do mesmo tamanho, em linhas e colunas I GridBagLayout: componentes em linhas e colunas, tamanhos exveis Rui Camacho
Flow Layout I Arranja os componentes da esquerda para a direita e do cimo para baixo I Coloca tantos componentes numa linha quanto possivel antes de passar a linha seguinte I deixa o utilizador especicar o alinhamentoe espacamento horizontal e vertical toolbar.setlayout(new FlowLayout(FlowLayout.LEFT)); toolbar.add(playbutton); toolbar.add(stopbutton);
Border Layout I Dsitribui os componentes pelos bordos ou centro I NORTH I SOUTH I EAST I WEST I CENTER I permite especicar espacamento horizontal e vertical contentpanel.setlayout(new BorderLayout(0,0)); contentpanel.add(\center", opanel); contentpanel.add(\south, controlpanel);
Grid Layout I Distribui os components numa grelha com um numero de colunas e linahs especicado I linhas t^em a mesma altura e colunas a mesma largura contentpanel.setlayout(new GridLayout(2,4)); contentpanel.add(startbutton, 0, 0); contentpanel.add(stopbutton, 1, 3);
JLabel { exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class LabelTest extends JFrame f private JLabel label1, label2, label3; public LabelTest()f // constroi o GUI super( "Testing JLabel" ); Container container = getcontentpane(); // obtem area colocar componentes container.setlayout( new FlowLayout() ); label1 = new JLabel( "Label with text" ); // construtor com argumento String label1.settooltiptext( "This is label1" ); container.add( label1 ); Icon bug = new ImageIcon("bug1.gif"); label2 = new JLabel( "Label with text and icon", bug, SwingConstants.LEFT ); // constr label2.settooltiptext( "This is label2" ); container.add( label2 ); Rui Camacho do livro Deitel Complementos & Deitel de Programac~ao e Algoritmos { LEIC
do livro Deitel & Deitel Rui Camacho JLabel { exemplo continuac~ao label3 = new JLabel(); // construtor sem argumentos label3.settext( "Label with icon and text at bottom" ); label3.seticon( bug ); label3.sethorizontaltextposition( SwingConstants.CENTER ); label3.setverticaltextposition( SwingConstants.BOTTOM ); label3.settooltiptext( "This is label3" ); container.add( label3 ); setsize( 275, 170 ); setvisible( true ); g public static void main( String args[] ) f // executar a apliaccao LabelTest application = new LabelTest(); application.setdefaultcloseoperation(jframe.exit ON CLOSE ); g g // m da classe LabelTest
do livro Deitel & Deitel Rui Camacho JTextField { exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextFieldTest extends JFrame f private JTextField textfield1, textfield2, textfield3; private JPasswordField passwordfield; public TextFieldTest() f // constroi o GUI super( "Testing JTextField and JPasswordField" ); Container container = getcontentpane(); container.setlayout( new FlowLayout() ); textfield1 = new JTextField( 10 ); container.add( textfield1 ); textfield2 = new JTextField( "Enter text here" ); container.add( textfield2 );
public static void main( String args[] ) f // executar a apliaccao TextFieldTest application = new TextFieldTest(); application.setdefaultcloseoperation(jframe.exit ON CLOSE); g Rui Camacho JTextField { exemplo continuac~ao textfield3 = new JTextField( "Uneditable text eld", 20 ); textfield3.seteditable( false ); container.add( textfield3 ); passwordfield = new JPasswordField( "Hidden text" ); container.add( passwordfield ); TextFieldHandler handler = new TextFieldHandler(); // registar o handler textfield1.addactionlistener( handler ); textfield2.addactionlistener( handler ); textfield3.addactionlistener( handler ); passwordfield.addactionlistener( handler ); setsize( 325, 100 ); setvisible( true ); g
do livro Deitel & Deitel Rui Camacho JTextField { exemplo continuac~ao private class TextFieldHandler implements ActionListener f //classe privada interna public void actionperformed( ActionEvent event )f // procesa os eventos String string = ""; if ( event.getsource() == textfield1 ) string = "textfield1: " + event.getactioncommand(); else if ( event.getsource() == textfield2 ) string = "textfield2: " + event.getactioncommand(); else if ( event.getsource() == textfield3 ) string = "textfield3: " + event.getactioncommand(); else if ( event.getsource() == passwordfield ) f JPasswordField pwd = (JPasswordField) event.getsource(); string = "passwordfield: " + new String(passwordField.getPassword()); g JOptionPane.showMessageDialog( null, string ); g g // m da classe privada interna TextFieldHandler g // m da classe TextFieldTest
JButton { exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonTest extends JFrame f private JButton plainbutton, fancybutton; public ButtonTest()f // cnstruir o GUI super( "Testing Buttons" ); Container container = getcontentpane(); container.setlayout( new FlowLayout() ); // criar os botoes plainbutton = new JButton( "Plain Button" ); container.add( plainbutton ); do livro Deitel & Deitel
JButton { exemplo continuac~ao Icon bug1 = new ImageIcon( "bug1.gif" ); Icon bug2 = new ImageIcon( "bug2.gif" ); fancybutton = new JButton( "Fancy Button", bug1 ); fancybutton.setrollovericon( bug2 ); container.add( fancybutton ); ButtonHandler handler = new ButtonHandler(); // event handler para os botoes fancybutton.addactionlistener( handler ); plainbutton.addactionlistener( handler ); setsize( 275, 100 ); setvisible( true ); g public static void main( String args[] ) f ButtonTest application = new ButtonTest(); application.setdefaultcloseoperation(jframe.exit ON CLOSE); g do livro Deitel & Deitel Rui Camacho
JButton { exemplo continuac~ao private class ButtonHandler implements ActionListener f public void actionperformed( ActionEvent event )f JOptionPane.showMessageDialog(null,"You pressed: "+event.getactioncommand()); g g // m da classe privada interna ButtonHandler g // m da classe ButtonTest do livro Deitel & Deitel
JRadioButton exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RadioButtonTest extends JFrame f private JTextField eld; private Font plainfont, boldfont, italicfont, bolditalicfont; private JRadioButton plainbutton, boldbutton, italicbutton, bolditalicbutton; private ButtonGroup radiogroup; do livro Deitel & Deitel
JRadioButton exemplo continuac~ao public RadioButtonTest()f // cria a GUI super( "RadioButton Test" ); Container container = getcontentpane(); // obtem area para colocacao componen container.setlayout( new FlowLayout() ); // escolhe layout eld = new JTextField("Watch the font style change", 25); container.add( eld ); // criar os botoes plainbutton = new JRadioButton("Plain", true); container.add(plainbutton); boldbutton = new JRadioButton( "Bold", false ); container.add( boldbutton ); italicbutton = new JRadioButton( "Italic", false ); container.add( italicbutton ); bolditalicbutton = new JRadioButton("Bold/Italic", false); container.add(bolditalicbutton); Rui Camacho
do livro Deitel & Deitel Rui Camacho JRadioButton exemplo continuac~ao // registar o handler para os botoes RadioButtonHandler handler = new RadioButtonHandler(); plainbutton.additemlistener( handler ); boldbutton.additemlistener( handler ); italicbutton.additemlistener( handler ); bolditalicbutton.additemlistener( handler ); // criar a relacao entre os botoes de um JRadioButtons radiogroup = new ButtonGroup(); radiogroup.add( plainbutton ); radiogroup.add( boldbutton ); radiogroup.add( italicbutton ); radiogroup.add( bolditalicbutton );
JRadioButton exemplo continuac~ao // criar objectos tipo font plainfont = new Font( "Serif", Font.PLAIN, 14 ); boldfont = new Font( "Serif", Font.BOLD, 14 ); italicfont = new Font( "Serif", Font.ITALIC, 14 ); bolditalicfont = new Font( "Serif", Font.BOLD + Font.ITALIC, 14 ); eld.setfont( plainfont ); setsize( 300, 100 ); setvisible( true ); g do livro Deitel & Deitel
do livro Deitel & Deitel Rui Camacho JRadioButton exemplo continuac~ao public static void main( String args[] ) f // executar a aplicacao RadioButtonTest application = new RadioButtonTest(); application.setdefaultcloseoperation(jframe.exit ON CLOSE ); g private class RadioButtonHandler implements ItemListener f public void itemstatechanged( ItemEvent event ) f // processar eventos if ( event.getsource() == plainbutton ) // click no plainbutton eld.setfont( plainfont ); else if ( event.getsource() == boldbutton ) // click no boldbutton eld.setfont( boldfont ); else if ( event.getsource() == italicbutton ) // click no italicbutton eld.setfont( italicfont ); else if ( event.getsource() == bolditalicbutton ) // click no bolditalicbutton eld.setfont( bolditalicfont ); g g // m da classe privada RadioButtonHandler g // m da classe RadioButtonTest
JComboBox exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxTest extends JFrame f private JComboBox imagescombobox; private JLabel label; private String names[] = f"bug1.gif","bug2.gif", "travelbug.gif","buganim.gif" g; private Icon icons[] = f new ImageIcon(names[0]), new ImageIcon(names[1]), new ImageIcon(names[2]), new ImageIcon(names[3]) g; do livro Deitel & Deitel
JComboBox exemplo continuac~ao public ComboBoxTest() f // construir a GUI super( "Testing JComboBox" ); Container container = getcontentpane(); // obter area para colocar componentes container.setlayout(new FlowLayout()); // escolher layout g imagescombobox = new JComboBox(names); imagescombobox.setmaximumrowcount(3); imagescombobox.additemlistener( // crie e registe o \listener" new ItemListener() f // classe anonima public void itemstatechanged(itemevent event) f // \event handler" if ( event.getstatechange() == ItemEvent.SELECTED ) label.seticon(icons[imagescombobox.getselectedindex()]); g g // m da classe anonima ); // m do registo do \listener" container.add( imagescombobox ); label = new JLabel( icons[ 0 ] ); // cria o JLabel container.add( label ); // coloca no contentor setsize( 350, 100 ); setvisible( true ); Rui Camacho
JComboBox exemplo continuac~ao public static void main( String args[] ) f // execute a aplicacao ComboBoxTest application = new ComboBoxTest(); application.setdefaultcloseoperation(jframe.exit ON CLOSE ); g g // m da classe ComboBoxTest do livro Deitel & Deitel
do livro Deitel & Deitel Rui Camacho JPanel exemplo import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PanelDemo extends JFrame f private JPanel buttonpanel; private JButton buttons[]; public PanelDemo() f // preparacao da GUI super( "Panel Demo" ); Container container = getcontentpane(); // obter local colocacao componentes buttons = new JButton[ 5 ]; // criar o array de botoes buttonpanel = new JPanel(); buttonpanel.setlayout(new GridLayout(1, buttons.length)); //escolha do layout
do livro Deitel & Deitel Rui Camacho JPanel exemplo { continuac~ao // criar e adicionar os botoes for(int count = 0; count < buttons.length; count++) f buttons[count] = new JButton(\Button \ + (count + 1)); buttonpanel.add(buttons[count]); g container.add( buttonpanel, BorderLayout.SOUTH ); setsize( 425, 150 ); setvisible( true ); g public static void main( String args[] ) f // execute a aplicacao PanelDemo application = new PanelDemo(); application.setdefaultcloseoperation(jframe.exit ON CLOSE); g g // m da classe PanelDemo