11.4. Klasse StringBuffer Nadat een String object gecreëerd is, kan de inhoud ervan nooit meer veranderen StringBuffer wordt gebruikt voor zogenaamde “dynamische strings” (dit is een aanpasbare versie van String) 1 Capaciteit geeft het aantal karakters die een Stringbuffer kan bevatten aan. Als de capaciteit overtroffen wordt, dan breidt ze zich automatisch uit, om de bijkomende karakters te kunnen opvangen Gebruik + en += voor STRINGconcatenatie. De klasse Stringbuffer wordt gebruikt om deze operatoren te implementeren (zie 11.17). 2 11.4.1. StringBuffer constructors Er zijn drie constructoren voor de klasse Stringbuffer: buffer1 = new StringBuffer() Creëert een lege buffer met capaciteit van 16 karakters buffer2 = new StringBuffer(lengte) Creëert een lege buffer met capaciteit het aantal karakters dat door de integer lengte wordt aangegeven buffer 3 = new StringBuffer(“tekst”) Creëert een buffer met inhoud “tekst” en met capaciteit het aantal karakters in de string “tekst” + 16 dus in het vb.: 5 + 16 = 21 3 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 29 30 // Fig. 11.10: StringBufferConstructors.java // Dit programma demonstreert de StringBuffer constructors. // Java extension packages import javax.swing.*; public class StringBufferConstructors { // test StringBuffer constructors public static void main( String args[] ) { StringBuffer buffer1, buffer2, buffer3; De drie constructoren: 1. 2. buffer1 = new StringBuffer(); buffer2 = new StringBuffer( 10 ); buffer3 = new StringBuffer( "hello" ); String output "buffer1 = "\nbuffer2 "\nbuffer3 3. Default constructor maakt lege buffer met capaciteit 16 2e constructor maakt lege buffer met capaciteit 10 3e constructor maakt buffer met tekst “hello” en capaciteit 21 = \"" + buffer1.toString() + "\"" + = \"" + buffer2.toString() + "\"" + = \"" + buffer3.toString() + "\""; JOptionPane.showMessageDialog( null, output, "Demonstrating StringBuffer Class Constructors", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde klasse StringBufferConstructors 4 12 13 14 15 16 17 18 19 20 21 22 23 24 25 StringBuffer buffer1, buffer2, buffer3; buffer1 = new StringBuffer(); buffer2 = new StringBuffer( 10 ); buffer3 = new StringBuffer( "hello" ); String output = "buffer1 = \"" + buffer1.toString() + "\"" + "\nbuffer2 = \"" + buffer2.toString() + "\"" + "\nbuffer3 = \"" + buffer3.toString() + "\""; JOptionPane.showMessageDialog( null, output, "Demonstrating StringBuffer Class Constructors", JOptionPane.INFORMATION_MESSAGE ); 5 11.4.2. StringBuffer methodes length, capacity, setLength en ensureCapacity Methode length Geeft het aantal karakters in de StringBuffer terug Methode capacity Geeft de capaciteit van de StringBuffer terug capaciteit = aantal karakters dat kan opgeslagen worden zonder meer geheugenruimte te moeten alloceren 6 Methode setLength Verhoogt of verlaagt de lengte van de StringBuffer Methode ensureCapacity Stelt de capaciteit van de StringBuffer in Garandeert dat de StringBuffer een minimum capaciteit heeft Let op: als de originele capaciteit kleiner is dan de nieuwe, dan wordt de capaciteit ofwel het getal dat aangegeven wordt in het argument ofwel 2 * de originele capaciteit + 2, naargelang wat groter is 7 1 2 3 4 5 6 7 8 10 11 12 13 14 16 17 18 20 21 23 24 25 26 27 28 29 30 31 32 33 34 // Fig. 11.11: StringBufferCapLen.java // Dit programma demonstrateert de methodes // length en capacity van de StringBuffer klasse. // Java extension packages import javax.swing.*; public class StringBufferCapLen { // test StringBuffer methodes capacity en length public static void main( String args[] ) { StringBuffer buffer = new StringBuffer( "Hello, how are you?" ); String output = "buffer = " + buffer.toString() + "\nlength = " + buffer.length() + "\ncapacity = " + buffer.capacity(); buffer.ensureCapacity( 75 ); output += "\n\nNew capacity = " + buffer.capacity(); buffer.setLength( 10 ); output += "\n\nNew length = " + buffer.length() + "\nbuf = " + buffer.toString(); JOptionPane.showMessageDialog( null, output, "StringBuffer length and capacity Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde klasse StringBufferCapLen 8 13 14 16 17 18 20 21 23 24 25 StringBuffer buffer = new StringBuffer( "Hello, how are you?" ); String output = "buffer = " + buffer.toString() + "\nlength = " + buffer.length() + "\ncapacity = " + buffer.capacity(); buffer.ensureCapacity( 75 ); output += "\n\nNew capacity = " + buffer.capacity(); buffer.setLength( 10 ); output += "\n\nNew length = " + buffer.length() + "\nbuf = " + buffer.toString(); 19+16=35 75 > 72 (= 2*35 + 2) 9 11.4.3. StringBuffer methodes charAt, setCharAt, getChars en reverse Om karakters in een StringBuffer te manipuleren, zijn volgende methodes ter beschikking: Methode charAt Geeft het karakter uit de StringBuffer terug dat zich op de gespecifieerde index bevindt Indien de index buiten de grenzen van de StringBuffer valt, dan krijg je een StringIndexOutOfBoundsException 10 11.4.3. StringBuffer methodes charAt, setCharAt, getChars en reverse (verv.) Method setCharAt Vult het opgegeven karakter in de StringBuffer in op de gespecifieerde index Zie charAt voor indexwaarde die buiten de grenzen valt 11 11.4.3. StringBuffer methodes charAt, setCharAt, getChars en reverse (verv.) Method getChars Geeft een array van karakters terug die overeenkomt met de inhoud van de StringBuffer 4 argumenten: startindex, index 1 positie voorbij laatste te kopiëren karakter, de array waarnaar moet gekopieerd worden en de beginpositie in de array Method reverse Keert de inhoud van de StringBuffer om 12 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 29 30 31 // Fig. 11.12: StringBufferChars.java // De charAt, setCharAt, getChars en reverse methodes // van de klasse StringBuffer. // Java extension packages import javax.swing.*; public class StringBufferChars { // test StringBuffer karakter methodes public static void main( String args[] ) { StringBuffer buffer = new StringBuffer( "hello there" ); String output = "buffer = " + buffer.toString() + "\nCharacter at 0: " + buffer.charAt( 0 ) + "\nCharacter at 4: " + buffer.charAt( 4 ); char charArray[] = new char[ buffer.length() ]; buffer.getChars( 0, buffer.length(), charArray, 0 ); output += "\n\nThe characters are: "; for ( int count = 0; count < charArray.length; ++count ) output += charArray[ count ]; buffer.setCharAt( 0, 'H' ); buffer.setCharAt( 6, 'T' ); output += "\n\nbuf = " + buffer.toString(); buffer.reverse(); output += "\n\nbuf = " + buffer.toString(); 13 32 33 34 35 36 37 38 39 40 JOptionPane.showMessageDialog( null, output, "Demonstrating StringBuffer Character Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde klasse StringBufferChars 14 13 14 15 16 17 18 19 20 21 22 23 24 StringBuffer buffer = new StringBuffer( "hello there" ); String output = "buffer = " + buffer.toString() + "\nCharacter at 0: " + buffer.charAt( 0 ) + "\nCharacter at 4: " + buffer.charAt( 4 ); char charArray[] = new char[ buffer.length() ]; buffer.getChars( 0, buffer.length(), charArray, 0 ); output += "\n\nThe characters are: "; for ( int count = 0; count < charArray.length; ++count ) output += charArray[ count ]; 15 13 StringBuffer buffer = new StringBuffer( "hello there" ); 26 27 28 29 30 31 buffer.setCharAt( 0, 'H' ); buffer.setCharAt( 6, 'T' ); output += "\n\nbuf = " + buffer.toString(); buffer.reverse(); output += "\n\nbuf = " + buffer.toString(); 16 11.4.4. StringBuffer append methodes 10 overloaded append methodes om de verschillende datatypes te kunnen aan het uiteinde van een StringBuffer plakken Een versie voor elk van de primitieve datatypes plus een voor karakterarrays, een voor Strings en een voor Objects 17 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. 11.13: StringBufferAppend.java // Dit programma demonstreert de append // methodes van de StringBuffer klasse. // Java extension packages import javax.swing.*; public class StringBufferAppend { // test StringBuffer append methodes public static void main( String args[] ) { Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; boolean b = true; char c = 'Z'; int i = 7; long l = 10000000; float f = 2.5f; double d = 33.333; StringBuffer buffer = new StringBuffer(); buffer.append( o ); buffer.append( " " ); o is een object van de klasse Object en wordt eerst omgezet naar een String waarna het kan worden geplakt aan de bestaande Stringbuffer (die tot dan toe nog leeg was) 18 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 buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( s ); " " ); charArray ); " " ); charArray, 0, 3 ); " " ); b ); " " ); c ); " " ); i ); " " ); l ); " " ); f ); " " ); d ); Voeg ook achtereenvolgens een String object, een karakterarray, een gedeelte van een karakterarray, een booleaanse variabele, een karakter, een integer, een long, een float en een double toe achteraan de StringBuffer JOptionPane.showMessageDialog( null, "buffer = " + buffer.toString(), "Demonstrating StringBuffer append Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde StringBufferAppend 19 13 14 15 Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 22 StringBuffer buffer = new StringBuffer(); 24 25 buffer.append( o ); buffer.append( " " ); 27 28 29 30 31 32 buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( buffer.append( s ); " " ); charArray ); " " ); charArray, 0, 3 ); " " ); 20 16 17 18 19 20 21 33 34 35 36 37 38 39 40 41 42 43 boolean b = true; char c = 'Z'; int i = 7; long l = 10000000; float f = 2.5f; double d = 33.333; buffer.append( b ); buffer.append( " " ); buffer.append( c ); buffer.append( " " ); buffer.append( i ); buffer.append( " " ); buffer.append( l ); buffer.append( " " ); buffer.append( f ); buffer.append( " " ); buffer.append( d ); 21 Gebruik + en += voor STRINGconcatenatie. De klasse StringBuffer wordt gebruikt om deze operatoren te implementeren. String string1 = “hello”; String string2 = “BC”; int value = 22; String s = string1 + string2 + value; new StringBuffer().append(“hello”).append( “BC”).append(22).toString(); 22 11.4.5. StringBuffer tussenvoeg- en verwijdermethodes Methode insert 9 overloaded methodes om de verschillende datatypes te kunnen tussenvoegen op en gegeven positie in een StringBuffer Twee argumenten: index en het in te voegen gedeelte StringIndexOutOfBoundsException bij verkeerde indexwaarde 23 11.4.5. StringBuffer tussenvoeg- en verwijdermethodes (verv.) Methode delete Wist een reeks karakters Twee argumenten: startpositie en indexwaarde één positie voorbij het einde van de te wissen karakters StringIndexOutOfBoundsException bij verkeerde indexwaarde 24 11.4.5. StringBuffer tussenvoeg- en verwijdermethodes (verv.) Methode deleteCharAt Wist één karakter Eén argument: positie van het te wissen karakter StringIndexOutOfBoundsException bij verkeerde indexwaarde 25 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 29 30 31 // Fig. 11.14: StringBufferInsert.java // Dit programma demonstreert de insert en delete // methodes van de klasse StringBuffer. // Java extension packages import javax.swing.*; public class StringBufferInsert { // test StringBuffer insert methodes public static void main( String args[] ) { Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; boolean b = true; char c = 'K'; int i = 7; long l = 10000000; float f = 2.5f; double d = 33.333; StringBuffer buffer = new StringBuffer(); buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( 0, 0, 0, 0, 0, 0, 0, 0, o ); " " ); s ); " " ); charArray ); " " ); b ); " " ); Insert op positie 0 dus de verschillende objecten worden telkens vooraan in de buffer toegevoegd, voor alle andere 26 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 buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( 0, 0, 0, 0, 0, 0, 0, 0, 0, c " i " l " f " d ); " ); " ); " ); " ); ); ); ); ); String output = "buffer after inserts:\n" + buffer.toString(); buffer.deleteCharAt( 10 ); buffer.delete( 2, 6 ); // delete 5 in 2.5 // delete .333 in 33.333 output += "\n\nbuffer after deletes:\n" + buffer.toString(); JOptionPane.showMessageDialog( null, output, "Demonstrating StringBufferer Inserts and Deletes", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde klasse StringBufferInsert 27 13 14 15 16 17 18 Object o = "hello"; String s = "good bye"; char charArray[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; boolean b = true; char c = 'K'; int i = 7; 22 23 24 25 26 27 28 29 30 31 32 33 34 35 StringBuffer buffer = new StringBuffer(); buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, o ); " " ); s ); " " ); charArray ); " " ); b ); " " ); c ); " " ); i ); " " ); 28 19 20 21 long l = 10000000; float f = 2.5f; double d = 33.333; 36 37 38 39 40 41 42 43 44 buffer.insert( buffer.insert( buffer.insert( buffer.insert( buffer.insert( 45 46 47 48 49 buffer.deleteCharAt( 10 ); buffer.delete( 2, 6 ); 0, 0, 0, 0, 0, l ); " " ); f ); " " ); d ); String output = "buffer after inserts:\n" + buffer.toString(); // delete 5 in 2.5 // delete .333 in 33.333 output += "\n\nbuffer after deletes:\n" + buffer.toString(); 29 11.5. Klasse Character Primitieve variabelen als objecten behandelen: Klasses Boolean, Character, Double, Float, Byte, Short, Integer en Long Behalve Boolean en Character worden deze klasses afgeleid van de klasse Number Deze 8 klassen worden “type wrappers” genoemd en maken deel uit van java.lang 30 11.5. Klasse Character (verv.) Klasse Character: type wrapper voor karakters Meeste methodes zijn static en doen een test op of manipuleren een karakter Constructor die aan de hand van een char argument een Character object maakt Zie voorbeelden en Java API documentatie voor meer informatie 31 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 29 30 31 // // // // Fig. 11.15: StaticCharMethods.java Demonstreert de statische karakter test methodes en verandering van hoofd- naar kleine letters en omgekeerd van de klasse Character uit de java.lang package. // Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class StaticCharMethods extends JFrame { private char c; private JLabel promptLabel; private JTextField inputField; private JTextArea outputArea; // maak de GUI public StaticCharMethods() { super( "Static Character Methods" ); Container container = getContentPane(); container.setLayout( new FlowLayout() ); promptLabel = new JLabel( "Enter a character and press Enter" ); container.add( promptLabel ); inputField = new JTextField( 5 ); 32 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 59 60 61 inputField.addActionListener( // anonieme inner klasse new ActionListener() { // vang het event vanuit het tekstveld op public void actionPerformed( ActionEvent event ) { String s = event.getActionCommand(); c = s.charAt( 0 ); buildOutput(); } } // einde anonieme inner klasse ); // einde oproep naar addActionListener container.add( inputField ); outputArea = new JTextArea( 10, 20 ); container.add( outputArea ); setSize( 300, 250 ); show(); // stel de venstergrootte in // toon het venster } // toon de karakter info in de outputArea public void buildOutput() { 33 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 outputArea.setText( "is defined: " + Character.isDefined( c ) + "\nis digit: " + Character.isDigit( c ) + "\nis Java letter: " + Character.isJavaIdentifierStart( c ) + "\nis Java letter or digit: " + Character.isJavaIdentifierPart( c ) + "\nis letter: " + Character.isLetter( c ) + "\nis letter or digit: " + Character.isLetterOrDigit( c ) + "\nis lower case: " + Character.isLowerCase( "\nis upper case: " + Character.isUpperCase( "\nto upper case: " + Character.toUpperCase( "\nto lower case: " + Character.toLowerCase( c c c c ) ) ) ) + + + ); } // voer de applicatie uit public static void main( String args[] ) { StaticCharMethods application = new StaticCharMethods(); application.addWindowListener( // anonieme inner klasse new WindowAdapter() { // vang de event op wanneer de gebruiker het venster sluit public void windowClosing( WindowEvent windowEvent ) { System.exit( 0 ); } 34 93 94 95 96 97 98 99 100 } // einde anonieme inner klasse ); // einde oproep naar addWindowListener } } // einde methode main // einde klasse StaticCharMethods 35 13 14 public class StaticCharMethods extends JFrame { private char c; … 20 21 public StaticCharMethods() { … 31 33 35 36 37 38 39 40 41 42 43 44 46 inputField = new JTextField( 5 ); inputField.addActionListener( // anonieme inner klasse new ActionListener() { } // vang het event vanuit het tekstveld op public void actionPerformed( ActionEvent event ) { String s = event.getActionCommand(); c = s.charAt( 0 ); buildOutput(); } // einde anonieme inner klasse 36 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 // toon de karakter info in de outputArea public void buildOutput() { outputArea.setText( "is defined: " + Character.isDefined( c ) + "\nis digit: " + Character.isDigit( c ) + "\nis Java letter: " + Character.isJavaIdentifierStart( c ) + "\nis Java letter or digit: " + Character.isJavaIdentifierPart( c ) + "\nis letter: " + Character.isLetter( c ) + "\nis letter or digit: " + Character.isLetterOrDigit( c ) + "\nis lower case: " + Character.isLowerCase( "\nis upper case: " + Character.isUpperCase( "\nto upper case: " + Character.toUpperCase( "\nto lower case: " + Character.toLowerCase( } c c c c ) ) ) ) 37 + + + ); 38 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 29 30 31 // Fig. 11.15: StaticCharMethods2.java // Demonstreert de statische karakterconversie methodes // van de klasse Character uit de java.lang package. // Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class StaticCharMethods2 extends JFrame { private char c; private int digit, radix; private JLabel prompt1, prompt2; private JTextField input, radixField; private JButton toChar, toInt; public StaticCharMethods2() { super( "Character Conversion Methods" ); // maak de GUI en stel de event handling in Container container = getContentPane(); container.setLayout( new FlowLayout() ); prompt1 = new JLabel( "Enter a digit or character " ); input = new JTextField( 5 ); container.add( prompt1 ); container.add( input ); 39 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 59 60 61 62 prompt2 = new JLabel( "Enter a radix " ); radixField = new JTextField( 5 ); container.add( prompt2 ); container.add( radixField ); toChar = new JButton( "Convert digit to character" ); toChar.addActionListener( // anonieme inner klasse new ActionListener() { // vang de event op komende van de JButton toChar public void actionPerformed( ActionEvent actionEvent ) { digit = Integer.parseInt( input.getText() ); radix = Integer.parseInt( radixField.getText() ); JOptionPane.showMessageDialog( null, Converteer een getal digit "Convert digit to character: " + naar een karakter volgens het Character.forDigit( digit, radix ) ); getallenstelsel met basis } aangegeven door radix } // einde anonieme inner klasse Vb. Radix = 16 is het hexadecimaal getallenstelsel ); // einde oproep naar addActionListener container.add( toChar ); toInt = new JButton( "Convert character to digit" ); 40 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 toInt.addActionListener( // anonieme inner klasse new ActionListener() { // vang de event op komende van de JButton toInt public void actionPerformed( ActionEvent actionEvent ) { String s = input.getText(); c = s.charAt( 0 ); Converteer een karakter c radix = naar een getal volgens het Integer.parseInt( radixField.getText() ); getallenstelsel met basis JOptionPane.showMessageDialog( null, aangegeven door radix "Convert character to digit: " + Vb. Radix = 16 is het Character.digit( c, radix ) ); hexadecimaal getallenstelsel } } // einde anonieme inner klasse ); // einde oproep naar addActionListener container.add( toInt ); setSize( 275, 150 ); show(); // stel de venstergrootte in // toon het venster } 41 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 // voer de applicatie uit public static void main( String args[] ) { StaticCharMethods2 application = new StaticCharMethods2(); application.addWindowListener( // anonieme inner klasse new WindowAdapter() { // vang de event op wanneer de gebruiker het venster sluit public void windowClosing( WindowEvent windowEvent ) { System.exit( 0 ); } } // einde anonieme inner klasse ); // einde oproep naar addWindowListener } } // einde methode main // einde klasse StaticCharMethods2 42 12 13 14 … 19 20 … 37 39 41 42 45 46 47 48 49 50 51 52 53 55 57 public class StaticCharMethods2 extends JFrame { private char c; private int digit, radix; public StaticCharMethods2() { toChar = new JButton( "Convert digit to character" ); toChar.addActionListener( // anonieme inner klasse new ActionListener() { public void actionPerformed( ActionEvent actionEvent ) { digit = Integer.parseInt( input.getText() ); radix = Integer.parseInt( radixField.getText() ); JOptionPane.showMessageDialog( null, "Convert digit to character: " + Character.forDigit( digit, radix ) ); } } // einde anonieme inner klasse ); // einde oproep naar addActionListener 43 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 82 toInt = new JButton( "Convert character to digit" ); toInt.addActionListener ( // anonieme inner klasse new ActionListener() { // vang de event op komende van de JButton toInt public void actionPerformed( ActionEvent actionEvent ) { String s = input.getText(); c = s.charAt( 0 ); radix = Integer.parseInt( radixField.getText() ); JOptionPane.showMessageDialog( null, "Convert character to digit: " + Character.digit( c, radix ) ); } } // einde anonieme inner klasse ); // einde oproep naar addActionListener 44 45 1 2 3 4 5 6 7 8 10 11 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 // Fig. 11.19: OtherCharMethods.java // Demonstreert de non-static methodes van de klasse // Character uit de java.lang package. // Java extension packages import javax.swing.*; public class OtherCharMethods { // test de non-static Character methodes public static void main( String args[] ) { Character c1, c2; c1 = new Character( 'A' ); c2 = new Character( 'a' ); String output = "c1 = " + c1.charValue() + "\nc2 = " + c2.toString() + "\n\nhash code for c1 = " + c1.hashCode() + "\nhash code for c2 = " + c2.hashCode(); if ( c1.equals( c2 ) ) output += "\n\nc1 and c2 are equal"; else output += "\n\nc1 and c2 are not equal"; JOptionPane.showMessageDialog( null, output, "Demonstrating Non-Static Character Methods", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } } // einde klasse OtherCharMethods 46 11 13 15 16 18 19 20 21 23 public static void main( String args[] ) { Character c1, c2; c1 = new Character( 'A' ); c2 = new Character( 'a' ); String output = "c1 = " + c1.charValue() + "\nc2 = " + c2.toString() + "\n\nhash code for c1 = " + c1.hashCode() + "\nhash code for c2 = " + c2.hashCode(); if ( c1.equals( c2 ) ) 24 output += "\n\nc1 and c2 are equal"; 25 26 else output += "\n\nc1 and c2 are not equal"; 47 11.6. Klasse StringTokenizer Token Cfr. Lezen van een zin We delen de zin op in woorden en leestekens Elk onderdeel (=token) heeft een mening voor ons Compiler deelt statement op in keywords, identifiers, operators en andere elementen van de programmeertaal 48 11.6. Klasse StringTokenizer (verv.) Token Klasse StringTokenizer (uit package java.util) deelt een String op in onderdeeltjes (substrings) die van elkaar gescheiden zijn door een afbakening (delimiter). Dit zijn typisch whitespace karakters of een ander teken. 49 11.6. Klasse StringTokenizer (vervolg) Constructoren van klasse StringTokenizer Uit het voorbeeld: constructor met één argument Neemt als afbakening voor de tokens de default delimiter string “ \n\t\r” bestaande uit een spatie, een newline karakter, een tab en een carriage return Constructor met twee String argumenten Tweede String is de delimiter string 50 11.6. Klasse StringTokenizer (vervolg) Constructoren van klasse StringTokenizer Constructor met drie argumenten (2 Strings en een boolean) Tweede String is opnieuw de delimiter string Boolean bepaalt of de delimiters ook als tokens moeten teruggekeerd worden (ja indien true, nee indien false). Dit laatste is handig als je wilt weten wat de afbakeningen waren. 51 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 29 30 31 // Fig. 11.18: TokenTest.java // Test van de StringTokenizer klasse uit de java.util package // Java core packages import java.util.*; import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class TokenTest extends JFrame { private JLabel promptLabel; private JTextField inputField; private JTextArea outputArea; // maak de GUI en vang de events op public TokenTest() { super( "Testing Class StringTokenizer" ); Container container = getContentPane(); container.setLayout( new FlowLayout() ); promptLabel = new JLabel( "Enter a sentence and press Enter" ); container.add( promptLabel ); inputField = new JTextField( 20 ); inputField.addActionListener( 52 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 59 60 61 62 63 // anonieme inner klasse new ActionListener() { // vang het event vanuit het tekstveld op public void actionPerformed( ActionEvent event ) { String stringToTokenize = event.getActionCommand(); StringTokenizer tokens = new StringTokenizer( stringToTokenize ); } actionPerformed wordt uitgevoerd wanneer de gebruiker op Enter drukt in het JTextField inputField Methode nextToken: outputArea.setText( "Number of elements: " + Zonder argumenten: tokens.countTokens() + "\nThe tokens are:\n" ); bepaalt het volgende token volgens dezelfde while ( tokens.hasMoreTokens() ) delimiter string outputArea.append( tokens.nextToken() + "\n" ); Met 1 argument (String): } stelt de nieuwe delimiter string in volgens dewelke de tokens worden bepaald // einde anonieme inner klasse ); // einde oproep naar addActionListener container.add( inputField ); outputArea = new JTextArea( 10, 20 ); outputArea.setEditable( false ); container.add( new JScrollPane( outputArea ) ); setSize( 275, 260 ); show(); } // stel de venstergrootte in // toon het venster 53 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 // voer de applicatie uit public static void main( String args[] ) { TokenTest application = new TokenTest(); application.addWindowListener( // anonieme inner klasse new WindowAdapter() { // vang het event op wanneer de gebruiker het venster sluit public void windowClosing( WindowEvent windowEvent ) { System.exit( 0 ); } } // einde anonieme inner klasse ); // einde oproep naar addWindowListener } } // einde methode main // einde klasse TokenTest 54 12 public class TokenTest extends JFrame … { //…… 18 public TokenTest() 19 { … 31 33 34 37 39 40 41 42 inputField.addActionListener( // anonieme inner klasse new ActionListener() { public void actionPerformed( ActionEvent event ) { String stringToTokenize = event.getActionCommand(); StringTokenizer tokens = new StringTokenizer( stringToTokenize ); 43 44 45 outputArea.setText( "Number of elements: " + tokens.countTokens() + "\nThe tokens are:\n" ); 46 47 48 49 51 53 while ( tokens.hasMoreTokens() ) outputArea.append( tokens.nextToken() + "\n" ); } } // einde anonieme inner klasse ); // einde oproep naar addActionListener 55 56 11.7. Simulatie kaarten schudden en delen DeckOfCards applicatie Creëert een boek met 52 speelkaarten aan de hand van Card objecten “Deal card” button deelt de kaarten één voor één. De gedeelde kaart wordt in een JTextField getoond. “Shuffle cards” button schudt de kaarten Maakt gebruik van random getallen 57 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 29 30 31 // Fig. 11.19: DeckOfCards.java // Programma voor het schudden en delen van kaarten // Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class DeckOfCards extends JFrame { private Card deck[]; private int currentCard; private JButton dealButton, shuffleButton; private JTextField displayField; private JLabel statusLabel; currentCard geeft het nummer van de laatst gedeelde kaart aan, -1 als er nog geen kaarten gedeeld werden // maak een boek kaarten en de GUI public DeckOfCards() { super( "Card Dealing Program" ); String faces[] = { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" }; String suits[] = { "Hearts", "Diamonds", "Clubs", "Spades" }; deck = new Card[ 52 ]; currentCard = -1; 58 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 59 60 61 62 // vul het boek speelkaarten met Card objecten for ( int count = 0; count < deck.length; count++ ) deck[ count ] = new Card( faces[ count % 13 ], suits[ count / 13 ] ); deck[] wordt geïnitialiseerd als een array bestaande uit de kaarten van aas tot en met koning in volgorde voor elke kleur // maak de GUI en vang de events op Container container = getContentPane(); container.setLayout( new FlowLayout() ); dealButton = new JButton( "Deal card" ); dealButton.addActionListener( // anonieme inner klasse new ActionListener() { // deel één kaart public void actionPerformed( ActionEvent actionEvent ) { Card dealt = dealCard(); if ( dealt != null ) { displayField.setText( dealt.toString() ); statusLabel.setText( "Card #: " + currentCard ); } else { displayField.setText( "NO MORE CARDS TO DEAL" ); statusLabel.setText( "Shuffle cards to continue" ); } } 59 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 } // einde anonieme inner klasse ); // einde oproep naar addActionListener container.add( dealButton ); shuffleButton = new JButton( "Shuffle cards" ); shuffleButton.addActionListener( // anonieme inner klasse new ActionListener() { // schud de kaarten public void actionPerformed( ActionEvent actionEvent ) { displayField.setText( "SHUFFLING ..." ); shuffle(); displayField.setText( "DECK IS SHUFFLED" ); } } // einde anonieme inner klasse ); // einde oproep naar addActionListener container.add( shuffleButton ); displayField = new JTextField( 20 ); displayField.setEditable( false ); container.add( displayField ); 60 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 statusLabel = new JLabel(); container.add( statusLabel ); setSize( 275, 120 ); show(); // stel de venstergrootte in // toon het venster } // schud de kaarten met een algoritme dat deze taak in één beweging uitvoert public void shuffle() { currentCard = -1; // voor elke kaart, trek een andere random kaart en verwissel de twee for ( int first = 0; first < deck.length; first++ ) { int second = ( int ) ( Math.random() * 52 ); Card temp = deck[ first ]; deck[ first ] = deck[ second ]; deck[ second ] = temp; } dealButton.setEnabled( true ); } 61 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 144 146 148 150 151 // deel één kaart public Card dealCard() { if ( ++currentCard < deck.length ) return deck[ currentCard ]; else { dealButton.setEnabled( false ); return null; } } // voer de applicatie uit public static void main( String args[] ) { DeckOfCards app = new DeckOfCards(); app.addWindowListener( // anonieme inner klasse new WindowAdapter() { } // beëindig de applicatie als de gebruiker het venster sluit public void windowClosing( WindowEvent windowEvent ) { System.exit( 0 ); } } // einde anonieme inner klasse ); // einde oproep naar addWindowListener } // einde methode main // einde klasse DeckOfCards 62 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 // klasse die een kaart representeert class Card { private String face; private String suit; // constructor om een kaart te initialiseren public Card( String cardFace, String cardSuit ) { face = cardFace; suit = cardSuit; } // geef de String represenatie van het Card object terug public String toString() { return face + " of " + suit; } } // einde klasse Card 63 Oefening 1 Schrijf een applicatie die een regel tekst als invoer krijgt, de tekst in tokens opdeelt met behulp van een StringTokenizer en de tokens in omgekeerde volgorde weergeeft. 64 Oefening 1 import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Oef10_13 extends JFrame { private JLabel inputlbl, outputlbl; private JTextField inputfld, outputfld; public Oef11_13() { super ("Tokens in een zin omkeren"); Container c = getContentPane(); c.setLayout(new FlowLayout()); 65 inputlbl = new JLabel("Geef een zin en druk op Enter:"); c.add(inputlbl); inputfld = new JTextField(20); inputfld.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { String outputstr = ""; String inputstr = e.getActionCommand(); StringTokenizer tokens = new StringTokenizer(inputstr); while (tokens.hasMoreTokens()) outputstr = tokens.nextToken() + " " + outputstr; outputfld.setText(outputstr); } } 66 outputfld = new JTextField(20); outputfld.setEditable(false); c.add(outputfld); setSize(275,200); show(); } public static void main (String args[]) { Oef11_13 app = new Oef11_13(); app.addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } } ); } } 67 Oefening 2 Schrijf een applicatie die alle mogelijke codes van 0 tot 255 omzet naar het bijhorende karakter uit de Unicode-tabel. De resultaten worden getoond in een JTextarea. 68 import java.text.*; Oefening 2 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Oef11_20 extends JFrame { private JTextArea outputarea; public Oef11_20() { super ("De Unicode tabel van karakters"); Container c = getContentPane(); c.setLayout(new FlowLayout()); outputarea = new JTextArea(15,25); c.add(outputarea); outputarea.setText(buildOutput()); outputarea.setEditable(false); setSize(750,600); show(); } 69 public String buildOutput() { String output = ""; DecimalFormat driecijfers = new DecimalFormat("000"); for (int i=0; i<=255; i++) { char kar = (char) i; Character c = new Character(kar); output += driecijfers.format(i) + " " + c.charValue() + "\t"; if ((i+1)%8 == 0) output += "\n"; } return output; } 70 public static void main (String args[]) { Oef11_20 app = new Oef11_20(); app.addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } } ); } } 71