Hoofdstuk 13: Graphical User Interface Componenten: Deel 1 JAVA 1 1 Inleiding Grafische Gebruikers Interface (GUI) Geeft ieder programma een verschillend uiterlijk en gedrag (“look- and - feel”) Plaatst de gebruikers in een vertrouwde omgeving Is opgebouwd uit GUI componenten (schuifbalken, icoon, etc.) Via de muis en het toetsenbord heeft de gebruiker interactie met de GUI componenten, etc. JAVA 2 Voorbeeld: Netscape Navigator windows met GUI componenten. button menus menu bar combo box scroll bars JAVA 3 Enkele GUI componenten Component Beschrijving JLabel Een gebied waar niet-editeerbare tekst of iconen afgedrukt worden. JTextField Een gebied waar de gebruiker de invoer via het toetsenbord intypt. Het kan ook gegevens tonen. JButton Door het klikken op deze button wordt een event uitgevoerd. JCheckBox Een GUI component dat niet of wel aangekruist is. JComboBox Een drop-down lijst waarbinnen de gebruiker een keuze kan maken door op een item te klikken ofwel door het item in de box in te typen JList Een gebied waar een lijst van items getoond wordt en waaruit de gebruiker een keuze maakt door één keer te klikken op dat element uit de lijst. Dubbelklikken op een element brengt een actie event teweeg. Men kan meerdere elementen kiezen. JPanel Een container waain men componenten kan plaatsen. JAVA 4 2 Overzicht Swing Swing GUI componenten package javax.swing met oorsprong in AWT (package java.awt) Geven een vertrouwd uiterlijk en gedrag Uitzicht en manier van interactie tussen de gebruikers en het programma “Lightweight” componenten Volledig in Java geschreven Platform-onafhankelijk JAVA 5 2 Overzicht Swing (2) class Component Bevat de methode paint die Component op het scherm tekent class Container Verzameling van bij elkaar horende componenten Bevat de methode add voor het toevoegen van componenten JAVA 6 2 Overzicht Swing (3) class JComponent “Plugable look and feel” het uiterlijk en het gedrag wijzigt mee met het gebruikte platform Shortcut keys (mnemonics) Gemeenschappelijke events gelijkaardig afhandelen JAVA 7 Gemeenschappelijke superclasses voor vele Swing componenten. Object Object Component Component Container Container JComponent JComponent JAVA 8 3 JLabel label Stelt de tekst/informatie op een GUI voor class JLabel definieert labels Kan voorstellen: Een lijntje read-only tekst Een beeld Tekst en beeld JAVA 9 VB: Gebruik van de class JLabel Demonstratie labels: Tekst Beeld links en tekst rechts Tekst onder het beeld Beweeg met cursor JAVA 10 // Fig. 13.4: LabelTest.java 2 // Demonstrating the JLabel class. 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 7 public class LabelTest extends JFrame { 8 private JLabel label1, label2, label3; 9 10 // set up GUI 11 public LabelTest() 12 { 13 super( "Testing JLabel" ); 14 15 // get content pane and set its layout 16 Container container = getContentPane(); 17 container.setLayout( new FlowLayout() ); 18 19 // JLabel constructor with a string argument 20 label1 = new JLabel( "Label with text" ); 21 label1.setToolTipText( "This is label1" ); 22 container.add( label1 ); 23 Declareer drie JLabels Maak het eerste JLabel met tekst “Label with text” Tool tip is tekst die verschijnt wanneer de gebruiker de cursor beweegt over JLabel 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 // JLabel constructor with string, Icon and alignment arguments Icon bug = new ImageIcon( "bug1.gif" ); label2 = new JLabel( "Label with text and icon", bug, SwingConstants.LEFT ); label2.setToolTipText( "This is label2" ); container.add( label2 ); // JLabel constructor no arguments label3 = new JLabel(); 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 ); } // end constructor public static void main( String args[] ) { LabelTest application = new LabelTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class LabelTest Maak het tweede JLabel met tekst langs de linkerkant van het beeld Maak het derde JLabel met tekst onder het beeld 4 Event-Handling Model GUI’s zijn event driven genereert events op het ogenblik dat de gebruiker met GUI interactief is de muis bewegen, op een knop klikken, tekst intypen in een tekst field, etc. class java.awt.AWTEvent JAVA 14 Enkele event classes van de package java.awt.event Object Object ActionEvent ActionEvent EventObject EventObject AdjustmentEvent AdjustmentEvent AWTEvent AWTEvent ContainerEvent ContainerEvent ItemEvent ItemEvent FocusEvent FocusEvent TextEvent TextEvent PaintEvent PaintEvent ComponentEvent ComponentEvent WindowEvent WindowEvent InputEvent InputEvent KeyEvent KeyEvent MouseEvent MouseEvent MouseWheelEvent MouseWheelEvent JAVA 15 4 Event-Handling Model (2) Drie delen Event source Event object GUI component waarop de gebruiker inwerkt Bevat de informatie over het event dat optrad Event listener Ontvangt een event object bij het optreden, geeft dan een antwoord via het object JAVA 16 4 Event-Handling Model (3) Programmeur moet twee taken uitvoeren Registreer de “event listener” voor de “event source” Implementeer een event-handling methode (event handler) JAVA 17 Event-listener interfaces van package java.awt.event interface «interface» ActionListener ActionListener interface «interface» AdjustmentListener AdjustmentListener interface «interface» ComponentListener ComponentListener interface «interface» ContainerListener ContainerListener interface «interface» FocusListener FocusListener interface «interface» EventListener EventListener interface «interface» ItemListener ItemListener interface «interface» KeyListener KeyListener interface «interface» MouseListener MouseListener interface «interface» MouseMotionListener MouseMotionListener interface «interface» TextListener TextListener interface «interface» WindowListener TextListener JAVA 18 5 JTextField en JPasswordField JTextField Is een gebied waarin een gebruiker één lijntje tekst kan inbrengen JPasswordField extends JTextField Verbergt de karakters die de gebruiker intypt JAVA 19 VB: Het gebruik van de class JTextField Demonstratie invoervelden: Lege velden Velden met opschrift Niet-editeerbare velden Velden met paswoorden De interactie wordt weergegeven JAVA 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.7: TextFieldTest.java // Demonstrating the JTextField class. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextFieldTest extends JFrame { private JTextField textField1, textField2, textField3; private JPasswordField passwordField; // set up GUI public TextFieldTest() { super( "Testing JTextField and JPasswordField" ); Declareer drie JTextField’s en een JPasswordField Container container = getContentPane(); container.setLayout( new FlowLayout() ); // construct textfield with default sizing textField1 = new JTextField( 10 ); container.add( textField1 ); // construct textfield with default text textField2 = new JTextField( "Enter text here" ); container.add( textField2 ); Het eerste JTextField bevat een lege string Het tweede JTextField bevat de tekst “Enter text here” 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 // construct textfield with default text, // 20 visible elements and no event handler textField3 = new JTextField( "Uneditable text field", 20 ); textField3.setEditable( false ); container.add( textField3 ); // construct passwordfield with default text passwordField = new JPasswordField( "Hidden text" ); container.add( passwordField ); // register event handlers TextFieldHandler handler = new TextFieldHandler(); textField1.addActionListener( handler ); textField2.addActionListener( handler ); textField3.addActionListener( handler ); passwordField.addActionListener( handler ); setSize( 325, 100 ); setVisible( true ); Het derde JTextField bevat niet-editeerbare tekst JPasswordField bevat tekst “Hidden text,” maar verschijnt als een rij sterren (*) Registreer GUI componenten met TextFieldHandler (registreer voor ActionEvent’s) } // end constructor TextFieldTest public static void main( String args[] ) { TextFieldTest application = new TextFieldTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 // private inner class for event handling private class TextFieldHandler implements ActionListener { // process textfield events public void actionPerformed( ActionEvent event ) { String string = ""; // user pressed Enter in JTextField textField1 if ( event.getSource() == textField1 ) string = "textField1: " + event.getActionCommand(); // user pressed Enter in JTextField textField2 else if ( event.getSource() == textField2 ) string = "textField2: " + event.getActionCommand(); // user pressed Enter in JTextField textField3 else if ( event.getSource() == textField3 ) string = "textField3: " + event.getActionCommand(); // user pressed Enter in JTextField passwordField else if ( event.getSource() == passwordField ) { string = "passwordField: " + new String( passwordField.getPassword() ); } Elk object van TextFieldHandler is een ActionListener Methode actionPerformed wordt aangeroepen wanneer de gebruiker Enter drukt in het GUI veld 80 81 82 83 84 85 86 87 JOptionPane.showMessageDialog( null, string ); } // end method actionPerformed } // end private inner class TextFieldHandler } // end class TextFieldTest 5.1 Hoe werkt Event Handling Twee open vragen uit het vorige deel 4 (1) Hoe wordt de event handler geregistreerd? Via de methode addActionListener van de component Lijnen 43-46 van TextFieldTest.java JAVA 25 5.1 Hoe werkt Event Handling (2) Twee open vragen uit het vorige deel 4 (2) Wanneer moet de component actionPerformed aanroepen? Event wordt alleen naar de listeners van het gepaste type verzonden Elk event type heeft een corresponderende event-listener interface De event ID specificeert het event type dat zich voordeed JAVA 26 Event registratie voor JTextField textField1. textField1 handler listenerList JTextField object public void actionPerformed( ActionEvent event ) { // event handled here } TextFieldHandler object ... This reference is created by the statement textField1.addActionListener( handler ); JAVA 27 6 JButton De gebruiker klikt op deze component om een bepaalde actie teweeg te brengen Verschillende types Command buttons Check boxes Toggle buttons Radio buttons javax.swing.AbstractButton subclasses Command buttons worden gecreëerd met class JButton ActionEvent’s worden gegenereerd wanneer de gebruiker op de button klikt JAVA 28 De hiërarchie van de button. JComponent JComponent AbstractButton AbstractButton JButton JToggleButton JButton JToggleButton JCheckBox JCheckBox JAVA JRadioButton JRadioButton 29 VB: Het maken van JButton’s Demonstratie van button’s JAVA 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // Fig. 13.10: ButtonTest.java // Creating JButtons. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonTest extends JFrame { private JButton plainButton, fancyButton; // set up GUI public ButtonTest() { super( "Testing Buttons" ); Maak twee referenties naar JButton instanties // get content pane and set its layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); // create buttons plainButton = new JButton( "Plain Button" ); container.add( plainButton ); Icon bug1 = new ImageIcon( "bug1.gif" ); Icon bug2 = new ImageIcon( "bug2.gif" ); fancyButton = new JButton( "Fancy Button", bug1 ); fancyButton.setRolloverIcon( bug2 ); container.add( fancyButton ); Maak Jbutton object met tekst Maak JButton object met beeld en rollover beeld 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 // create an instance of inner class ButtonHandler // to use for button event handling ButtonHandler handler = new ButtonHandler(); fancyButton.addActionListener( handler ); plainButton.addActionListener( handler ); setSize( 275, 100 ); setVisible( true ); Maak ButtonHandler object voor JButton event handling Registreer Jbutton’s om events te ontvangen van ButtonHandler } // end ButtonTest constructor public static void main( String args[] ) { ButtonTest application = new ButtonTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // inner class for button event handling private class ButtonHandler implements ActionListener { } // handle button event public void actionPerformed( ActionEvent event ) { JOptionPane.showMessageDialog( ButtonTest.this, "You pressed: " + event.getActionCommand() ); } // end private inner class ButtonHandler } // end class ButtonTest Wanneer de gebruiker op Jbutton klikt, start ButtonHandler de methode actionPerformed van alle geregistreerde listeners Oefening 1 Schrijf een applicatie die een temperatuur in Fahrenheit omzet in een temperatuur in Celsius. De temperatuur in Fahrenheit wordt via het toetsenbord ingevoerd (JTextField). Via een JLabel wordt de geconverteerde temperatuur afgedrukt. JAVA 34 // Convert.java // Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class Convert extends JFrame { private JLabel label1, label2; private JTextField temperatureF, temperatureC; // constructer sets up GUI public Convert() { super( "Temperature converter" ); //get content pane and set its layout Container container= getContentPane(); container.setLayout (new FlowLayout() ); label1 = new JLabel( "Enter Fahrenheit temperature:" ); temperatureF = new JTextField( 10 ); label2 = new JLabel( "Temperature in Celcius is:" ); temperatureC = new JTextField( 10 ); temperatureC.setEditable( false ); container.add( label1); container.add( temperatureF); container.add( label2); container.add( temperatureC); // register event handlers TextFieldHandler handler = new TextFieldHandler(); temperatureF.addActionListener( handler ); setSize( 200, 150 ); show(); } // execute application public static void main ( String args[] ) { Convert app = new Convert(); app.setDefaultCloseOperation( EXIT_ON_CLOSE ); } // private inner class for event handling private class TextFieldHandler implements ActionListener { public void actionPerformed( ActionEvent event ) { int temp = Integer.parseInt( temperatureF.getText() ); int celcius = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) ); temperatureC.setText( String.valueOf(celcius ) ); } } } // end class Convert 7 JCheckBox en JRadioButton State buttons On/Off of true/false waarden Java voorziet drie types JToggleButton JCheckBox JRadioButton JAVA 38 VB: Het maken van Checkbox button’s Bij het aanklikken van bijvoorbeeld bold wordt de tekst in het invoerveld opgemaakt JAVA 39 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // Fig. 13.11: CheckBoxTest.java // Creating JCheckBox buttons. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CheckBoxTest extends JFrame { private JTextField field; private JCheckBox bold, italic; // set up GUI public CheckBoxTest() { super( "JCheckBox Test" ); Declareer twee JCheckBox instanties // get content pane and set its layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); // set up JTextField and set its font field = new JTextField( "Watch the font style change", 20 ); field.setFont( new Font( "Serif", Font.PLAIN, 14 ) ); container.add( field ); Zet JTextField lettertypetype op Serif, 14-pt vol 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 // create checkbox objects bold = new JCheckBox( "Bold" ); container.add( bold ); Maak JCheckBox’s voor respectievelijk vet- en cursief JTextField tekst italic = new JCheckBox( "Italic" ); container.add( italic ); // register listeners for JCheckBoxes CheckBoxHandler handler = new CheckBoxHandler(); bold.addItemListener( handler ); italic.addItemListener( handler ); setSize( 275, 100 ); setVisible( true ); Registreer JCheckBox’s om events te ontvangen van CheckBoxHandler } // end CheckBoxText constructor public static void main( String args[] ) { CheckBoxTest application = new CheckBoxTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 // private inner class for ItemListener event handling private class CheckBoxHandler implements ItemListener { private int valBold = Font.PLAIN; private int valItalic = Font.PLAIN; // respond to checkbox events public void itemStateChanged( ItemEvent event ) { // process bold checkbox events if ( event.getSource() == bold ) valBold = bold.isSelected() ? Font.BOLD : Font.PLAIN; Wanneer de gebruiker JCheckBox selecteert, roept CheckBoxHandler de methode itemStateChanged aan van alle geregistreerde listeners // process italic checkbox events Wijzig JTextField lettertype, if ( event.getSource() == italic ) afhankelijk van de JCheckBox die valItalic = italic.isSelected() ? Font.ITALIC : Font.PLAIN; // set text field font field.setFont( new Font( "Serif", valBold + valItalic, 14 ) ); } // end method itemStateChanged } // end private inner class CheckBoxHandler } // end class CheckBoxTest geselecteerd was VB: Het maken van radio button’s via ButtonGroup en JRadioButton Bij het aanklikken van bijvoorbeeld bold wordt de tekst in het invoerveld opgemaakt JAVA 44 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.12: RadioButtonTest.java // Creating radio buttons using ButtonGroup and JRadioButton. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RadioButtonTest extends JFrame { private JTextField field; private Font plainFont, boldFont, italicFont, boldItalicFont; private JRadioButton plainButton, boldButton, italicButton, boldItalicButton; private ButtonGroup radioGroup; Declareer vier JRadioButton instanties // create GUI and fonts public RadioButtonTest() { super( "RadioButton Test" ); // get content pane and set its layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); // set up JTextField field = new JTextField( "Watch the font style change", 25 ); container.add( field ); JRadioButton’s verschijnen algemeen als een ButtonGroup 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 // create radio buttons plainButton = new JRadioButton( "Plain", true ); container.add( plainButton ); boldButton = new JRadioButton( "Bold", false ); container.add( boldButton ); italicButton = new JRadioButton( "Italic", false ); container.add( italicButton ); maak JRadioButton’s om het JTextField tekst lettertype te manipuleren boldItalicButton = new JRadioButton( "Bold/Italic", false ); container.add( boldItalicButton ); // create logical relationship between JRadioButtons radioGroup = new ButtonGroup(); radioGroup.add( plainButton ); radioGroup.add( boldButton ); radioGroup.add( italicButton ); radioGroup.add( boldItalicButton ); // create font objects 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 ); field.setFont( plainFont ); // set initial font JRadioButton’s behoren tot de ButtonGroup 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 // register events for JRadioButtons plainButton.addItemListener( new RadioButtonHandler( plainFont ) ); boldButton.addItemListener( new RadioButtonHandler( boldFont ) ); italicButton.addItemListener( Registreeer new RadioButtonHandler( italicFont ) ); JRadioButton’s boldItalicButton.addItemListener( events van de new RadioButtonHandler( boldItalicFont ) ); setSize( 300, 100 ); setVisible( true ); } // end RadioButtonTest constructor public static void main( String args[] ) { RadioButtonTest application = new RadioButtonTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // private inner class to handle radio button events private class RadioButtonHandler implements ItemListener { private Font font; public RadioButtonHandler( Font f ) { font = f; } om RadioButtonHandler te ontvangen 81 82 83 84 85 86 87 88 89 90 // handle radio button events public void itemStateChanged( ItemEvent event ) { field.setFont( font ); } } // end private inner class RadioButtonHandler } // end class RadioButtonTest Als een gebruiker JRadioButton selecteert, zal RadioButtonHandler de methode itemStateChanged van al de geregistreede listeners aanroepen Stel het lettertype in afhankelijk van de geselecteerde JRadioButton Oefening 2 Maak de volgende GUI, zonder functionaliteit. (Denk na over de schikking) JAVA 49 //LineTest_View1.java //Java core packages import java.awt.*; import java.awt.event.*; //Java extension packages import javax.swing.*; public class LineTest_View1 extends JFrame { private JRadioButton redButton, greenButton, blueButton, yellowButton; private ButtonGroup radioGroup; private JCheckBox dashed, thick, rounded; private JButton defaults, ok, cancel; //create GUI public LineTest_View1() { super ("LineTest View1"); //get content pane and set its layout Container container= getContentPane(); container.setLayout (new FlowLayout() ); //create radio buttons redButton = new JRadioButton("RED",false); container.add(redButton); greenButton = new JRadioButton("GREEN",false); container.add(greenButton); blueButton = new JRadioButton("BLUE",true); container.add(blueButton); yellowButton = new JRadioButton("YELLOW",false); container.add(yellowButton); //create logical relationship between JRadioButtons radioGroup = new ButtonGroup(); radioGroup.add(redButton); radioGroup.add(greenButton); radioGroup.add(blueButton); radioGroup.add(yellowButton); //create checkboxobjects dashed = new JCheckBox("DASHED"); container.add(dashed); thick = new JCheckBox("THICK"); container.add(thick); rounded = new JCheckBox("ROUNDED"); container.add(rounded); //create buttons defaults = new JButton("Defaults"); container.add(defaults); ok = new JButton("OK"); container.add(ok); cancel = new JButton("Cancel"); container.add(cancel); setSize(300,150); setVisible(true); } //execute application public static void main(String args[]) { LineTest_View1 application = new LineTest_View1(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } 8 JComboBox JComboBox Een lijst van items waaruit de gebruiker kan kiezen Ook een drop-down lijst genoemd JAVA 54 VB: Via een JComboBox een voor te stellen icoon kiezen JAVA 55 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 13.13: ComboBoxTest.java // Using a JComboBox to select an image to display. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxTest extends JFrame { private JComboBox imagesComboBox; private JLabel label; private String names[] = { "bug1.gif", "bug2.gif", "travelbug.gif", "buganim.gif" }; private Icon icons[] = { new ImageIcon( names[ 0 ] ), new ImageIcon( names[ 1 ] ), new ImageIcon( names[ 2 ] ), new ImageIcon( names[ 3 ] ) }; // set up GUI public ComboBoxTest() { super( "Testing JComboBox" ); // get content pane and set its layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 // set up JComboBox and register its event handler imagesComboBox = new JComboBox( names ); imagesComboBox.setMaximumRowCount( 3 ); imagesComboBox.addItemListener( new ItemListener() { // anonymous inner class Maak JComboBox om drie String’s uit array names samen te tonen Registreer JComboBox om events van de anonieme ItemListener te ontvangen // handle JComboBox event public void itemStateChanged( ItemEvent event ) { // determine whether check box selected if ( event.getStateChange() == ItemEvent.SELECTED ) label.setIcon( icons[ imagesComboBox.getSelectedIndex() ] ); } } // end anonymous inner class ); // end call to addItemListener container.add( imagesComboBox ); // set up JLabel to display ImageIcons label = new JLabel( icons[ 0 ] ); container.add( label ); Wanneer de gebruiker een item uit de JComboBox selecteert, roept ItemListener de methode itemStateChanged aan van alle geregistreede listeners Zet afhankelijk van de keuze van de gebruiker het gepaste Icon 52 53 54 55 56 57 58 59 60 61 62 63 setSize( 350, 100 ); setVisible( true ); } // end ComboBoxTest constructor pAublic static void main( String args[] ) { ComboBoxTest application = new ComboBoxTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class ComboBoxTest 9 JList List Verzameling van items De gebruiker kan één of meerdere items selecteren Single-selectie vs. multiple-selectie JList JAVA 59 VB: Achtergrondkleur kiezen uit een JList JAVA 60 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // Fig. 13.14: ListTest.java // Selecting colors from a JList. import java.awt.*; import javax.swing.*; import javax.swing.event.*; public class ListTest extends JFrame { private JList colorList; private Container container; private final String colorNames[] = { "Black", "Blue", "Cyan", "Dark Gray", "Gray", "Green", "Light Gray", "Magenta", "Orange", "Pink", "Red", "White", "Yellow" }; private final Color colors[] = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; // set up GUI public ListTest() { super( "List Test" ); // get content pane and set its layout container = getContentPane(); container.setLayout( new FlowLayout() ); 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 // create a list with items in colorNames array colorList = new JList( colorNames ); colorList.setVisibleRowCount( 5 ); De array colorNames wordt gebruikt om Jlist te vullen // do not allow multiple selections colorList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); // add a JScrollPane containing JList to content pane container.add( new JScrollPane( colorList ) ); colorList.addListSelectionListener( JList laat een single selectie toe new ListSelectionListener() { // anonymous inner class Registreer JList om events van de // handle list selection events anonieme ListSelectionListener public void valueChanged( ListSelectionEvent event ) te ontvangen { } container.setBackground( colors[ colorList.getSelectedIndex() ] ); } // end anonymous inner class ); // end call to addListSelectionListener Wanneer de gebruiker een item selecteert in JList, roept ListSelectionListener de methode valueChanged aan van alle geregistreerde listeners Afhankelijk van de keuze van de gebruiker wordt de achtergrond aangepast 53 54 55 56 57 58 59 60 61 62 63 64 setSize( 350, 150 ); setVisible( true ); } // end ListTest constructor public static void main( String args[] ) { ListTest application = new ListTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class ListTest 10 Multiple-Selection Lijsten Multiple-selection list Meerdere items kunnen uit JList gekozen worden Laat een aaneengesloten selectie toe JAVA 64 VB: Items van de ene naar de andere JList kopiëren JAVA 65 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // Fig. 13.15: MultipleSelectionTest.java // Copying items from one List to another. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MultipleSelectionTest extends JFrame { private JList colorList, copyList; private JButton copyButton; private final String colorNames[] = { "Black", "Blue", "Cyan", "Dark Gray", "Gray", "Green", "Light Gray", "Magenta", "Orange", "Pink", "Red", "White", "Yellow" }; // set up GUI public MultipleSelectionTest() { super( "Multiple Selection Lists" ); // get content pane and set its layout Container container = getContentPane(); container.setLayout( new FlowLayout() ); De array colorNames wordt gebruikt om Jlist te vullen // set up JList colorList colorList = new JList( colorNames ); colorList.setVisibleRowCount( 5 ); colorList.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); container.add( new JScrollPane( colorList ) ); 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 // create copy button and register its listener copyButton = new JButton( "Copy >>>" ); copyButton.addActionListener( new ActionListener() { // anonymous inner class // handle button event Wanneer de gebruiker de Jbutton public void actionPerformed( ActionEvent event ) { indrukt, zal JList copyList de // place selected values in copyList items gekozen door de gebruiker uit de copyList.setListData( colorList.getSelectedValues() ); JList colorList toevoegen } } // end anonymous inner class ); // end call to addActionListener container.add( copyButton ); // set up JList copyList copyList = new JList( ); copyList.setVisibleRowCount( 5 ); copyList.setFixedCellWidth( 100 ); copyList.setFixedCellHeight( 15 ); copyList.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION ); container.add( new JScrollPane( copyList ) ); JList colorList laat single selectie toe 57 58 59 60 61 62 63 64 65 66 67 68 69 setSize( 300, 130 ); setVisible( true ); } // end constructor MultipleSelectionTest public static void main( String args[] ) { MultipleSelectionTest application = new MultipleSelectionTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class MultipleSelectionTest 11 Mouse Event Handling De Event-listener interfaces MouseListener MouseMotionListener Listen for MouseEvents JAVA 69 MouseListener en MouseMotionListener interface methoden MouseListener en MouseMotionListener interface methodes Methodes van de interface MouseListener public void mousePressed( MouseEvent event ) Wordt opgeroepen bij het indrukken van de muisknop wanneer de muiscursor zich op een component bevindt. Wordt opgeroepen bij het klikken van de muisknop als deze zich op een component bevindt zonder de muiscursor te bewegen. Wordt opgereoepen wanneer de muisknop losgelaten wordt nadat hij ingedrukt werd. Deze event wordt steeds voorafgegaan door een mousePressed event. Wordt opgeroepen wanneer de muiscursor het gebied van de component betreedt. Wordt opgeroepen wanneer de muiscursor het gebied van de component verlaat. public void mouseClicked( MouseEvent event ) public void mouseReleased( MouseEvent event ) public void mouseEntered( MouseEvent event ) public void mouseExited( MouseEvent event ) Methodes van de interface MouseMotionListener public void mouseDragged( MouseEvent event ) Wordt opgeroepen wanneer de muisknop wordt ingedrukt terwijl de muiscursor zich op een component bevindt en wordt versleept. Deze event wordt steeds voorafgegaan door een aanroep van mousePressed. Wordt opgeroepen wanneer de muis verplaatst wordt terwijl de muiscursor zich op een component bevindt. public void mouseMoved( MouseEvent event ) . JAVA 70 VB: Voorstelling van “mouse events” JAVA 71 // Fig. 13.17: MouseTracker.java 2 // Demonstrating mouse events. 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 7 public class MouseTracker extends JFrame 8 implements MouseListener, MouseMotionListener { 9 10 private JLabel statusBar; 11 12 // set up GUI and register mouse event handlers 13 public MouseTracker() 14 { 15 super( "Demonstrating Mouse Events" ); 16 17 statusBar = new JLabel(); 18 getContentPane().add( statusBar, BorderLayout.SOUTH ); 19 20 addMouseListener( this ); // listens for own mouse and 21 addMouseMotionListener( this ); // mouse-motion events 22 23 setSize( 275, 100 ); 24 setVisible( true ); 25 } 26 Registreer JFrame om mouse events te ontvangen 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 // MouseListener event handlers // handle event when mouse released immediately after press public void mouseClicked( MouseEvent event ) { statusBar.setText( "Clicked at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when mouse pressed public void mousePressed( MouseEvent event ) { statusBar.setText( "Pressed at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when mouse released after dragging public void mouseReleased( MouseEvent event ) { statusBar.setText( "Released at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when mouse enters area public void mouseEntered( MouseEvent event ) { Wordt uitgevoerd wanneer de gebruiker de muisknop indrukt en loslaat Wordt uitgevoerd wanneer de gebruiker de muisknop indrukt Wordt uitgevoerd wanneer gebruiker de muisknop loslaat na het verslepen Wordt uitgevoerd wanneer de muiscursor Jframe binnengaat 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 } statusBar.setText( "Mouse entered at [" + event.getX() + ", " + event.getY() + "]" ); getContentPane().setBackground( Color.GREEN ); // handle event when mouse exits area public void mouseExited( MouseEvent event ) { statusBar.setText( "Mouse outside window" ); getContentPane().setBackground( Color.WHITE ); } // MouseMotionListener event handlers // handle event when user drags mouse with button pressed public void mouseDragged( MouseEvent event ) { statusBar.setText( "Dragged at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when user moves mouse public void mouseMoved( MouseEvent event ) { statusBar.setText( "Moved at [" + event.getX() + ", " + event.getY() + "]" ); } Wordt uitgevoerd wanneer de muiscursor Jframe verlaat Wordt uitgevoerd wanneer de gebruiker de muiscursor versleept Wordt uitgevoerd wanneer de gebruiker de muiscursor beweegt 79 80 81 82 ); 83 84 85 public static void main( String args[] ) { MouseTracker application = new MouseTracker(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE } } // end class MouseTracker 12 Adapter Classes Adapter class Implementeert een interface Voorziet in een default implementatie voor elke methode van de interface Wordt gebruikt als superclass wanneer niet alle methoden uit de overeenkomstige interface nodig zijn JAVA 76 Event adapter classes en de interfaces die ze implementeren. Event adapter class ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter implements interface ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener JAVA 77 VB: Gebruik van de class MouseMotionAdapter JAVA 78 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 13.19: Painter.java // Using class MouseMotionAdapter. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Painter extends JFrame { private int pointCount = 0; // array of 1000 java.awt.Point references private Point points[] = new Point[ 1000 ]; // set up GUI and register mouse event handler public Painter() { super( "A simple paint program" ); // create a label and place it in SOUTH of BorderLayout getContentPane().add( new JLabel( "Drag the mouse to draw" ), BorderLayout.SOUTH ); Registreer MouseMotionListener om de window’s ”mouse-motion events” new MouseMotionAdapter() { // anonymous inner class te horen addMouseMotionListener( 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 // store drag coordinates and repaint public void mouseDragged( MouseEvent event ) { if ( pointCount < points.length ) { points[ pointCount ] = event.getPoint(); ++pointCount; repaint(); } } Overschrijf alleen de methode mouseDragged, niet de methode mouseMoved Sla de plaatscoördinaten op waar de muis versleept was, herteken daarna JFrame } // end anonymous inner class ); // end call to addMouseMotionListener setSize( 300, 150 ); setVisible( true ); } // end Painter constructor // draw oval in a 4-by-4 bounding box at specified location on window public void paint( Graphics g ) { super.paint( g ); // clears drawing area } for ( int i = 0; i < points.length && points[ i ] != null; i++ ) g.fillOval( points[ i ].x, points[ i ].y, 4, 4 ); Teken een cirkel met diameter 4 waarnaar de gebruiker de cursor versleept heeft 53 54 55 56 57 58 59 60 public static void main( String args[] ) { Painter application = new Painter(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class Painter VB: Het gebruik van “mouse clicks” en het onderscheid tussen “mouse buttons” JAVA 82 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.20: MouseDetails.java // Demonstrating mouse clicks and distinguishing between mouse buttons. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MouseDetails extends JFrame { private int xPos, yPos; // set title bar String; register mouse listener; size and show window public MouseDetails() { super( "Mouse clicks and buttons" ); addMouseListener( new MouseClickHandler() ); } setSize( 350, 150 ); setVisible( true ); // draw String at location where mouse was clicked public void paint( Graphics g ) { // call superclass paint method super.paint( g ); Registreer de muis listener 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 } g.drawString( "Clicked @ [" + xPos + ", " + yPos + "]", xPos, yPos ); public static void main( String args[] ) { MouseDetails application = new MouseDetails(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } De methode mouseClicked wordt uitgevoerd wanneer de gebruiker op de muis klikt // handle mouse click event and determine which button was pressed Onthoud de muis-cursor public void mouseClicked( MouseEvent event ) coördinaten waar men op de { muis geklikt heeft // inner class to handle mouse events private class MouseClickHandler extends MouseAdapter { xPos = event.getX(); yPos = event.getY(); String title = "Clicked " + event.getClickCount() + " time(s)"; if ( event.isMetaDown() ) // right mouse button title += " with right mouse button"; else if ( event.isAltDown() ) // middle mouse button title += " with center mouse button"; Bepaal het aantal keer dat de gebruiker op de muis geklikt heeft Zoek uit of de gebruiker op de rechter muisknop heeft geklikt Zoek uit of de gebruiker op de middelste muisknop heeft geklikt 53 54 55 56 57 58 59 60 61 62 63 64 else // left mouse button title += " with left mouse button"; setTitle( title ); // set title bar of window repaint(); } // end method mouseClicked } // end private inner class MouseClickHandler } // end class MouseDetails InputEvent methoden voor mousebutton clicks InputEvent methode isMetaDown() isAltDown() Beschrijving Deze methode retourneert true wanneer de gebruiker de rechter muisknop van een twweof drieknopsmuis aanklikt. Om een rechter muisknop klik te simuleren met een één-knops muis, kan de gebruiker de Meta key op het toetsenbord indrukken en op de muisknop klikken. Deze methode retourneert true wanneer de gebruiker op de middelste muisknop klikt van een drie-knops-muis met drie knoppen Om een middelste muisknop klik te simuleren met een één-of twee-knops muis, kan de gebruiker de Alt key op het toetsenbord indrukken en op de muisknop klikken. JAVA 86 12 Event Handling voor het toetsenbord interface KeyListener Behandelt key events Treedt in werking wanneer de toetsen op het toetsenbord ingedrukt en losgelaten worden KeyEvent Bevat virtual key code die de toets voorstelt JAVA 87 VB: Voorstelling van de events van het toetsenbord JAVA 88 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.22: KeyDemo.java // Demonstrating keystroke events. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class KeyDemo extends JFrame implements KeyListener { private String line1 = "", line2 = "", line3 = ""; private JTextArea textArea; // set up GUI public KeyDemo() { super( "Demonstrating Keystroke Events" ); // set up JTextArea textArea = new JTextArea( 10, 15 ); textArea.setText( "Press any key on the keyboard..." ); textArea.setEnabled( false ); textArea.setDisabledTextColor( Color.BLACK ); getContentPane().add( textArea ); JFrame voor de toets events addKeyListener( this ); // allow frame to process KeyRegistreer events setSize( 350, 100 ); setVisible( true ); 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 } // end KeyDemo constructor // handle press of any key public void keyPressed( KeyEvent event ) Wordt aangeroepen wanneer { de gebruiker een toets indrukt line1 = "Key pressed: " + event.getKeyText( event.getKeyCode() ); setLines2and3( event ); } // handle release of any key Wordt aangeroepen wanneer public void keyReleased( KeyEvent event ) de gebruiker de toets loslaat { line1 = "Key released: " + event.getKeyText( event.getKeyCode() ); Geef de virtual key setLines2and3( event ); terug } // handle press of an action key public void keyTyped( KeyEvent event ) { line1 = "Key typed: " + event.getKeyChar(); setLines2and3( event ); } // set second and third lines of output private void setLines2and3( KeyEvent event ) { Wordt aangeroepen wanneer de gebruiker de toets intypt code 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 line2 = "This key is " + ( event.isActionKey() ? "" : "not " ) Zoekt + "an action key"; uit of modifier keys (zoals Alt, Ctrl, Meta en Shift) gebruikt werden String temp = event.getKeyModifiersText( event.getModifiers() ); line3 = "Modifier keys pressed: " + ( temp.equals( "" ) ? "none" : temp ); } textArea.setText( line1 + "\n" + line2 + "\n" + line3 + "\n" ); public static void main( String args[] ) { KeyDemo application = new KeyDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class KeyDemo 14 Layout Managers Layout managers Voorzien een ordening voor de GUI componenten Voorzien eenvoudige layout mogelijkheden Verwerken layout details De programmeur concentreert zich op de “look and feel” interface LayoutManager JAVA 93 Layout managers Layout manager FlowLayout BorderLayout GridLayout Beschrijving Default voor java.awt.Applet, java.awt.Panel en javax.swing.JPanel. Plaatst de componenten in de volgorde dat ze toegevoegd werden na elkaar (van links naar rechts). Het is ook mogelijk de volgorde van de componenten te specifieren door gebruik te maken maken van de Container methode add waar men de Component en de index plaats ( een integer) als argumenten meegeeft. Default voor de content panes of Jframe’s (en andere vensters) en Japplet’s. Ordent de componenten binnen vijf gebieden: North, South, East, West en Center. Ordent de componenten in rijen en kolommen. JAVA 94 14.1 FlowLayout FlowLayout De meest eenvoudige layout manager De GUI componenten worden in de container van links naar rechts geplaatst JAVA 95 VB: Het gebruik van FlowLayout JAVA 96 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 13.24: FlowLayoutDemo.java // Demonstrating FlowLayout alignments. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlowLayoutDemo extends JFrame { private JButton leftButton, centerButton, rightButton; private Container container; private FlowLayout layout; // set up GUI and register button listeners public FlowLayoutDemo() { super( "FlowLayout Demo" ); layout = new FlowLayout(); // get content pane and set its layout container = getContentPane(); container.setLayout( layout ); // set up leftButton and register listener leftButton = new JButton( "Left" ); container.add( leftButton ); FlowLayout wordt ingesteld 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 leftButton.addActionListener( new ActionListener() { // anonymous inner class // process leftButton event public void actionPerformed( ActionEvent event ) { layout.setAlignment( FlowLayout.LEFT ); } // realign attached components layout.layoutContainer( container ); } // end anonymous inner class ); // end call to addActionListener // set up centerButton and register listener centerButton = new JButton( "Center" ); container.add( centerButton ); centerButton.addActionListener( Wanneer de gebruiker de Jbutton leftButton indrukt, worden de componenten links gealigneerd new ActionListener() { // anonymous inner class // process centerButton event public void actionPerformed( ActionEvent event ) { layout.setAlignment( FlowLayout.CENTER ); Wanneer de gebruiker de JButton centerButton indrukt, worden de componenten gecentreerd 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 ); } } // realign attached components layout.layoutContainer( container ); // set up rightButton and register listener rightButton = new JButton( "Right" ); container.add( rightButton ); rightButton.addActionListener( new ActionListener() { // anonymous inner class // process rightButton event public void actionPerformed( ActionEvent event ) { layout.setAlignment( FlowLayout.RIGHT ); ); } } // realign attached components layout.layoutContainer( container ); setSize( 300, 75 ); setVisible( true ); Wanneer de gebruiker de JButton rightButton indrukt, worden de componenten rechts gealigneerd 81 82 83 84 85 86 87 88 89 90 } // end constructor FlowLayoutDemo public static void main( String args[] ) { FlowLayoutDemo application = new FlowLayoutDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class FlowLayoutDemo 14.2 BorderLayout BorderLayout Ordent de componenten binnen vijf gebieden NORTH SOUTH EAST WEST CENTER (bovenaan de container) (onderaan de container) (links in de container) (rechts in de container) (midden van de container) JAVA 101 VB: Het gebruik van BorderLayout JAVA 102 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.25: BorderLayoutDemo.java // Demonstrating BorderLayout. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo extends JFrame implements ActionListener { private JButton buttons[]; private final String names[] = { "Hide North", "Hide South", "Hide East", "Hide West", "Hide Center" }; private BorderLayout layout; // set up GUI and event handling public BorderLayoutDemo() { super( "BorderLayout Demo" ); layout = new BorderLayout( 5, 5 ); // 5 pixel gaps // get content pane and set its layout Container container = getContentPane(); container.setLayout( layout ); // instantiate button objects buttons = new JButton[ names.length ]; BorderLayout wordt ingesteld met horizontale en verticale 5-pixel afstanden 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 for ( int count = 0; count < names.length; count++ ) { buttons[ count ] = new JButton( names[ count ] ); buttons[ count ].addActionListener( this ); } // place buttons in BorderLayout; order not important container.add( buttons[ 0 ], BorderLayout.NORTH ); container.add( buttons[ 1 ], BorderLayout.SOUTH ); container.add( buttons[ 2 ], BorderLayout.EAST ); container.add( buttons[ 3 ], BorderLayout.WEST ); container.add( buttons[ 4 ], BorderLayout.CENTER ); De JButtons worden in de resp.gebieden gezet aangeduidt door de BorderLayout setSize( 300, 200 ); setVisible( true ); } // end constructor BorderLayoutDemo // handle button events public void actionPerformed( ActionEvent event ) { for ( int count = 0; count < buttons.length; count++ ) if ( event.getSource() == buttons[ count ] ) buttons[ count ].setVisible( false ); else buttons[ count ].setVisible( true ); Wanneer Jbutton’s “onzichtbaar ” zijn worden ze niet op het scherm getoond, en zal de BorderLayout ze herschikken 53 54 55 56 57 58 59 60 61 62 63 64 } // re-layout the content pane layout.layoutContainer( getContentPane() ); public static void main( String args[] ) { BorderLayoutDemo application = new BorderLayoutDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class BorderLayoutDemo 14.3 GridLayout GridLayout De container wordt verdeeld in een raster (grid) met een gegeven aantal rijen en kolommen Componenten worden toegevoegd vanaf de linkerbovencel Van links naar rechts tot het einde van de rij en dan de volgende rij JAVA 107 VB: Het gebruik van GridLayout JAVA 108 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // Fig. 13.26: GridLayoutDemo.java // Demonstrating GridLayout. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridLayoutDemo extends JFrame implements ActionListener { private JButton buttons[]; private final String names[] = { "one", "two", "three", "four", "five", "six" }; private boolean toggle = true; private Container container; private GridLayout grid1, grid2; // set up GUI public GridLayoutDemo() { super( "GridLayout Demo" ); // set up layouts grid1 = new GridLayout( 2, 3, 5, 5 ); grid2 = new GridLayout( 3, 2 ); // get content pane and set its layout container = getContentPane(); container.setLayout( grid1 ); Maak GridLayout grid1 met 2 rijen en 3 kolommen Maak GridLayout grid2 met 3 rijen en 2 kolommen 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 // create and add buttons buttons = new JButton[ names.length ]; for ( int count = 0; count < names.length; count++ ) { buttons[ count ] = new JButton( names[ count ] ); buttons[ count ].addActionListener( this ); container.add( buttons[ count ] ); } setSize( 300, 150 ); setVisible( true ); } // end constructor GridLayoutDemo // handle button events by toggling between layouts public void actionPerformed( ActionEvent event ) { if ( toggle ) container.setLayout( grid2 ); else container.setLayout( grid1 ); } toggle = !toggle; // set toggle to opposite value container.validate(); Wanneer de gebruiker Jbutton indrukt wijzigt de huidige GridLayout 53 54 55 56 57 58 59 60 public static void main( String args[] ) { GridLayoutDemo application = new GridLayoutDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class GridLayoutDemo 15 Panels Panel Helpt om de componenten te organiseren class JPanel is een subclass van JComponent Kan componenten en andere panels bevatten JAVA 112 VB: Gebruik van JPanel JAVA 113 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 13.27: PanelDemo.java // Using a JPanel to help lay out components. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PanelDemo extends JFrame { private JPanel buttonPanel; private JButton buttons[]; // set up GUI public PanelDemo() { super( "Panel Demo" ); // get content pane Container container = getContentPane(); // create buttons array buttons = new JButton[ 5 ]; // set up panel and set its layout buttonPanel = new JPanel(); Maak buttonPanel.setLayout( new GridLayout( 1, buttons.length ) ); JPanel buttonPanel om JButton’s bij te houden 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 // create and add buttons for ( int count = 0; count < buttons.length; count++ ) { buttons[ count ] = new JButton( "Button " + ( count + 1 ) ); buttonPanel.add( buttons[ count ] ); } Voeg JButton’s toe aan JPanel buttonPanel container.add( buttonPanel, BorderLayout.SOUTH ); setSize( 425, 150 ); setVisible( true ); } // end constructor PanelDemo Voeg JPanel buttonPanel toe aan het gebied “SOUTH” van Container container public static void main( String args[] ) { PanelDemo application = new PanelDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class PanelDemo Oefening 3 Haal oefening 2 terug en wijzig tot een meer georganiseerde GUI, weer zonder functionaliteit. JAVA 116 //LineTest_View2.java //Java core packages import java.awt.*; import java.awt.event.*; //Java extension packages import javax.swing.*; import javax.swing.border.*; public class LineTest_View2 extends JFrame { private JPanel leftPanel, rightPanel, middenPanel,buttonPanel; private JRadioButton redButton, greenButton, blueButton, yellowButton; private ButtonGroup radioGroup; private JCheckBox dashed, thick, rounded; private JButton defaults, ok, cancel; //create GUI public LineTest_View2() { super ("LineTest View2"); //get content pane and set its layout Container container= getContentPane(); //set up leftpanel and set its layout leftPanel = new JPanel(new GridLayout(4,1)); leftPanel.setBorder( new TitledBorder( new EtchedBorder(), "Line Color")); //create radio buttons in leftPanel redButton = new JRadioButton("RED",false); leftPanel.add(redButton); greenButton = new JRadioButton("GREEN",false); leftPanel.add(greenButton); blueButton = new JRadioButton("BLUE",true); leftPanel.add(blueButton); yellowButton = new JRadioButton("YELLOW",false); leftPanel.add(yellowButton); //create logical relationship between JRadioButtons radioGroup = new ButtonGroup(); radioGroup.add(redButton); radioGroup.add(greenButton); radioGroup.add(blueButton); radioGroup.add(yellowButton); //set up rightPanel and set its layout rightPanel = new JPanel(new GridLayout(4,1)); rightPanel.setBorder( new TitledBorder(new EtchedBorder(), "Line Properties")); //create checkboxobjects dashed = new JCheckBox("DASHED"); rightPanel.add(dashed); thick = new JCheckBox("THICK"); rightPanel.add(thick); rounded = new JCheckBox("ROUNDED"); rightPanel.add(rounded); //set up middenPanel (left + right) middenPanel= new JPanel(new GridLayout(1,2)); middenPanel.add(leftPanel); middenPanel.add(rightPanel); container.add(middenPanel); //set up buttonpanel and set its layout buttonPanel = new JPanel(); buttonPanel.setBorder(new TitledBorder(new EtchedBorder(),"")); //create buttons defaults = new JButton("Defaults"); buttonPanel.add(defaults); ok = new JButton("OK"); buttonPanel.add(ok); cancel = new JButton("Cancel"); buttonPanel.add(cancel); container.add(buttonPanel, BorderLayout.SOUTH); setSize(300,350); setVisible(true); } //execute application public static void main(String args[]) { LineTest_View2 application = new LineTest_View2(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }