Folgende Beispiele setzen die bisher vorgestellten, theoretischen Inhalte in praktische Anwendungen oder beispielhafte Algorithmen um. <applet archive="curve.jar" code="curve" width=200 height=150> </applet> // // Grafische Darstellung einer mathematischen Funktion: // Hanning-Filter // import java.awt.*; import java.applet.*; public class curve extends java.applet.Applet { double f(double x) { double px=Math.PI*x/getSize().width; return ((1-Math.cos(2*px))*Math.sin(12*px)+2)*getSize().height/4; } public void paint(Graphics g) { for (int x = 0 ; x < getSize().width ; x++) { g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1)); } } public String getAppletInfo() { return "Hanning-Filter: Sinuston"; } } [email protected] Applet Taschenrechner: <applet archive="taschenrechner.jar" code="taschenrechner" width=400 height=300> </applet> // // taschenrechner.java // import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class taschenrechner extends Applet implements ActionListener { JTextField anzeige; char op; double saveNum; double resultNum = (double) 0; double xNum = (double) 0; double memNum = (double) 0; char lastOp = '='; boolean epoint; boolean newNum = true; boolean dp = true; boolean start = true; boolean secpoint = false; // tasten JButton b1 = new JButton("1"); JButton b2 = new JButton("2"); [email protected] JButton b3 = new JButton("3"); JButton b4 = new JButton("4"); JButton b5 = new JButton("5"); JButton b6 = new JButton("6"); JButton b7 = new JButton("7"); JButton b8 = new JButton("8"); JButton b9 = new JButton("9"); JButton b0 = new JButton("0"); JButton o1 = new JButton("+"); JButton o2 = new JButton("-"); JButton o3 = new JButton("*"); JButton o4 = new JButton("."); JButton o5 = new JButton("±"); JButton o6 = new JButton("/"); JButton o7 = new JButton("M"); JButton o8 = new JButton("RM"); JButton o9 = new JButton("C"); JButton oa = new JButton("="); JButton ob = new JButton("π"); JButton oc = new JButton("e"); JButton od = new JButton("√"); public void init( ) { //tastenfeld, ereignisse JPanel h = new JPanel( ); h.setLayout(new BorderLayout(10,10)); anzeige = new JTextField("0"); anzeige.setEditable(false); JPanel p = new JPanel( ); p.setLayout(new GridLayout(7,4,5,5)); b1.setActionCommand("1"); b1.addActionListener(this); p.add(b1); b2.setActionCommand("2"); b2.addActionListener(this); p.add(b2); b3.setActionCommand("3"); b3.addActionListener(this); p.add(b3); o1.setActionCommand("+"); o1.addActionListener(this); p.add(o1); b4.setActionCommand("4"); b4.addActionListener(this); p.add(b4); [email protected] b5.setActionCommand("5"); b5.addActionListener(this); p.add(b5); b6.setActionCommand("6"); b6.addActionListener(this); p.add(b6); o2.setActionCommand("-"); o2.addActionListener(this); p.add(o2); b7.setActionCommand("7"); b7.addActionListener(this); p.add(b7); b8.setActionCommand("8"); b8.addActionListener(this); p.add(b8); b9.setActionCommand("9"); b9.addActionListener(this); p.add(b9); o3.setActionCommand("*"); o3.addActionListener(this); p.add(o3); b0.setActionCommand("0"); b0.addActionListener(this); p.add(b0); o4.setActionCommand("."); o4.addActionListener(this); p.add(o4); o5.setActionCommand("±"); o5.addActionListener(this); p.add(o5); o6.setActionCommand("/"); o6.addActionListener(this); p.add(o6); o7.setActionCommand("M"); o7.addActionListener(this); p.add(o7); o8.setActionCommand("RM"); o8.addActionListener(this); p.add(o8); o9.setActionCommand("C"); o9.addActionListener(this); p.add(o9); oa.setActionCommand("="); oa.addActionListener(this); p.add(oa); ob.setActionCommand("π"); ob.addActionListener(this); p.add(ob); oc.setActionCommand("e"); oc.addActionListener(this); p.add(oc); [email protected] od.setActionCommand("√"); od.addActionListener(this); p.add(od); h.add("North", anzeige); h.add("Center", p); add(h); } public void actionPerformed(ActionEvent evt) { String s = evt.getActionCommand( ); if(s.charAt(0) == '.') epoint = true; else epoint = false; if((s.charAt(0) >= '0' && s.charAt(0) <= '9') || epoint) { if(newNum) { if(epoint) { secpoint=true; anzeige.setText("0"+s); } else anzeige.setText(s); } else // ausnahmebehandlung 2. dezimalpunkt if(epoint && secpoint) { anzeige.setText(anzeige.getText( )); } else { if(epoint) secpoint=true; anzeige.setText(anzeige.getText( )+s); } newNum = false; } else { secpoint = false; op = s.charAt(0); xNum = Double.parseDouble(anzeige.getText( )); // parseDouble, eine Methode der Klasse Double, wertet das String-Objekt im // Argument aus. Kann diese Zeichenkette als gültige Zahl (Double) gelesen werden, // so gibt sie deren Wert als Gleitkommazahl mit doppelter Genauigkeit zurück. if(lastOp == '=') resultNum = xNum; switch(op) { case '√': [email protected] if(xNum >= 0) { saveNum = Math.sqrt(xNum); anzeige.setText("" + saveNum); } else { anzeige.setText("negativer Radikand"); resultNum = (double) 0; saveNum = resultNum; op = '='; } if(lastOp == '=') resultNum = saveNum; op = lastOp; break; case 'π': saveNum = Math.PI; anzeige.setText("" + saveNum); if(lastOp == '=') resultNum = saveNum; op = lastOp; break; case 'e': saveNum = Math.E; anzeige.setText("" + saveNum); if(lastOp == '=') resultNum = saveNum; op = lastOp; break; default: op = s.charAt(0); save(Double.parseDouble(anzeige.getText( ))); newNum = true; lastOp = op; } } } public void save(double x) { saveNum = x; switch(op) { case 'M': memNum = x; op = lastOp; break; case 'R': saveNum = memNum; anzeige.setText("" + saveNum); op = lastOp; break; case 'C': [email protected] resultNum = (double) 0; saveNum = resultNum; anzeige.setText("0"); op = '='; break; case '±': saveNum = -x; anzeige.setText("" + saveNum); op=lastOp; break; default: switch(lastOp) { case '+': resultNum += saveNum; anzeige.setText("" + resultNum); break; case '-': resultNum -= saveNum; anzeige.setText("" + resultNum); break; case '*': resultNum *= saveNum; anzeige.setText("" + resultNum); break; case '/': resultNum /= saveNum; anzeige.setText("" + resultNum); break; } } if (start) { resultNum=saveNum; start=false; } } } [email protected] Der folgende Abschnitt enthält 3 verschiedene Java-Applets, die alle die Ausgabe von Zeichenketten in einem vorgegeben Bereich des Browserfensters betreffen, wobei auf verschiedene Pakete und Methoden zurückgegriffen wird. Die entsprechenden Befehle zum Aufruf in einer HTML-Seite sind jeweils vorangestellt. Einfaches Applet (Zeichenkette - Schriftart: serif, 24 pt; Formatierung: kursiv, fett, grau) <html> <head> <title>Einfaches Applet </title> </head> <body> <applet archive="apl1.jar" code="apl1" width=300 height=150> Unterstützt der Browser kein Java, so wird nichts angezeigt. </applet> </body> </html> // apl1.java // Einfaches Java applet import java.awt.*; import java.applet.*; public class apl1 extends Applet { static final String message = "Fachbereich Medien"; private Font font = new Font("serif", Font.ITALIC + Font.BOLD, 24); public void init( ) { setLayout (null); } public void paint (Graphics g) { g.setColor(Color.gray); g.setFont(font); g.drawString(message, 40, 80); } } [email protected] Einfaches Swing Applet (Zeichenkette - Schriftart: serif, 24 pt; Formatierung: kursiv, fett, grau; Erscheinungsbild der Java-Entwicklungsumgebung). Verwendet werden Elemente des Abstract Windowing Toolkit sowie deren Weiterführungen in Form von Swing-Klassen. <applet archive="apl2.jar" code="apl2" width=300 height=150> </applet> // apl2.java // Einfaches Java Swing applet import java.awt.*; import java.applet.*; import javax.swing.*; public class apl2 extends JApplet { static final String message = "Fachbereich Medien"; private Font font = new Font("serif", Font.ITALIC + Font.BOLD, 24); public void init( ) { // Setzt das Standard-Erscheinungsbild String laf = UIManager.getSystemLookAndFeelClassName( ); // Fehler, die den Absturz eines Programms verursachen könnten, aber auch // andere unvorhergesehene Situationen fängt das Ausnahmemanagement auf. // Es schützt Programmcode bzw. Methoden, die zu möglichen Ausnahmen // führen, innerhalb eines try-Blocks. Reaktionen (z. B. Fehlermeldungen) auf // die konkrete Ausnahme werden im catch-Block festgelegt; falls der Code // nicht funktioniert, fängt catch die Ausnahme auf, andernfalls wird das // Programm nach dem try-Block fortgeführt. try { UIManager.setLookAndFeel(laf); } catch (UnsupportedLookAndFeelException exc) { System.err.println ("Warning: UnsupportedLookAndFeel: " + laf); } catch (Exception exc) { System.err.println ("Error loading " + laf + ": " + exc); } getContentPane( ).setLayout (null); } public void paint (Graphics g) { super.paint(g); g.setColor(Color.blue); g.setFont(font); g.drawString(message, 40, 80); } } [email protected] Einfaches Applet (Text mehrzeilig) <applet archive="gedichtApplet.jar" code="gedichtApplet" width=300 height=300> </applet> // gedicht.java import java.awt.*; import java.applet.*; public class gedichtApplet extends javax.swing.JApplet { public void paint(Graphics screen) { Graphics2D screen2D = (Graphics2D)screen; String line0 = "es heißt"; String line1 = "als der teufel"; String line2 = "den donner erfand"; String line3 = "erschraken die ersten"; String line4 = "menschen zu tode"; String line5 = "da sagte zu ihnen"; String line6 = "gott"; String line7 = '\u0022' + "fürchtet euch nicht"; String line8 = "ehe er donnert"; String line9 = "lass ich es blitzen"; String line10 = "dann wisst ihr bescheid" + '\u0022'; screen2D.drawString(line0, 5, 50); screen2D.drawString(line1, 5, 70); screen2D.drawString(line2, 5, 80); screen2D.drawString(line3, 5, 100); screen2D.drawString(line4, 5, 110); screen2D.drawString(line5, 25, 140); screen2D.drawString(line6, 40, 160); screen2D.drawString(line7, 60, 180); screen2D.drawString(line8, 60, 190); screen2D.drawString(line9, 60, 200); screen2D.drawString(line10, 60, 220); } } [email protected] Das folgende Beispiel zeigt 2 zusammengehörige Java-Quelltexte, die eine grafische Benutzerschnittstelle innerhalb einer eigenständigen Anwendung (application1) erzeugen. Das Beispiel beeinhaltet, die Anzeige einer Zeichenkette (String message), die AufklappMenüs File und Edit, sowie eine AboutBox, welche nach Anklicken des Namens der Anwendung in der Menüleiste Beschreibungen zum Programm, zum Programmierer (im Beispiel: email) oder zum Copyright präsentiert. Letztere Informationen können nach ihrem Aufruf über ein okButton wieder ausgeblendet werden. // application1.java import java.awt.*; import java.awt.event.*; import com.apple.mrj.*; public class application1 extends Frame implements ActionListener, MRJAboutHandler, MRJQuitHandler { static final String message = "Fachbereich Medien"; private Font font = new Font("serif", Font.ITALIC+Font.BOLD, 24); protected AboutBox aboutBox; // Klassen im Paket AWT, um Menüs und Menükommandos zu erzeugen sind: // CheckboxMenuItem, Menu, MenuBar, MenuItem static final MenuBar mainMenuBar = new MenuBar( ); static final Menu fileMenu = new Menu("File"); protected MenuItem miNew; protected MenuItem miOpen; protected MenuItem miClose; protected MenuItem miSave; protected MenuItem miSaveAs; static final Menu editMenu = new Menu("Edit"); protected MenuItem miUndo; protected MenuItem miCut; protected MenuItem miCopy; protected MenuItem miPaste; protected MenuItem miClear; protected MenuItem miSelectAll; public void addFileMenuItems( ) { miNew = new MenuItem ("New"); miNew.setShortcut(new MenuShortcut(KeyEvent.VK_N, false)); fileMenu.add(miNew).setEnabled(true); miNew.addActionListener(this); [email protected] miOpen = new MenuItem ("Open..."); miOpen.setShortcut(new MenuShortcut(KeyEvent.VK_O, false)); fileMenu.add(miOpen).setEnabled(true); miOpen.addActionListener(this); miClose = new MenuItem ("Close"); miClose.setShortcut(new MenuShortcut(KeyEvent.VK_W, false)); fileMenu.add(miClose).setEnabled(true); miClose.addActionListener(this); miSave = new MenuItem ("Save"); miSave.setShortcut(new MenuShortcut(KeyEvent.VK_S, false)); fileMenu.add(miSave).setEnabled(true); miSave.addActionListener(this); miSaveAs = new MenuItem ("Save As..."); miSaveAs.setShortcut(new MenuShortcut(KeyEvent.VK_S, true)); fileMenu.add(miSaveAs).setEnabled(true); miSaveAs.addActionListener(this); mainMenuBar.add(fileMenu); } public void addEditMenuItems( ) { miUndo = new MenuItem("Undo"); miUndo.setShortcut(new MenuShortcut(KeyEvent.VK_Z, false)); editMenu.add(miUndo).setEnabled(true); miUndo.addActionListener(this); editMenu.addSeparator( ); miCut = new MenuItem("Cut"); miCut.setShortcut(new MenuShortcut(KeyEvent.VK_X, false)); editMenu.add(miCut).setEnabled(true); miCut.addActionListener(this); miCopy = new MenuItem("Copy"); miCopy.setShortcut(new MenuShortcut(KeyEvent.VK_C, false)); editMenu.add(miCopy).setEnabled(true); miCopy.addActionListener(this); miPaste = new MenuItem("Paste"); miPaste.setShortcut(new MenuShortcut(KeyEvent.VK_V, false)); editMenu.add(miPaste).setEnabled(true); miPaste.addActionListener(this); miClear = new MenuItem("Clear"); editMenu.add(miClear).setEnabled(true); miClear.addActionListener(this); editMenu.addSeparator( ); [email protected] miSelectAll = new MenuItem("Select All"); miSelectAll.setShortcut(new MenuShortcut(KeyEvent.VK_A, false)); editMenu.add(miSelectAll).setEnabled(true); miSelectAll.addActionListener(this); mainMenuBar.add(editMenu); } public void addMenus( ) { addFileMenuItems( ); addEditMenuItems( ); setMenuBar (mainMenuBar); } public application1( ) { super("application1"); setLayout(null); addMenus( ); aboutBox = new AboutBox( ); Toolkit.getDefaultToolkit( ); MRJApplicationUtils.registerAboutHandler(this); MRJApplicationUtils.registerQuitHandler(this); setVisible(true); } public void paint(Graphics g) { g.setColor(Color.blue); g.setFont (font); g.drawString(message, 40, 100); } public void handleAbout( ) { aboutBox.setResizable(false); aboutBox.setVisible(true); aboutBox.show( ); } public void handleQuit( ) { System.exit(0); } [email protected] // ActionListener: Schnittstelle zu Festlegung von Aktionen (Ereignissen), die durch den Benutzer (im Beispiel Anklicken der Menübefehle) ausgelöst werden. public void actionPerformed(ActionEvent newEvent) { if (newEvent.getActionCommand( ).equals(miNew.getActionCommand( ))) doNew( ); else if (newEvent.getActionCommand( ).equals(miOpen.getActionCommand( ))) doOpen( ); else if (newEvent.getActionCommand( ).equals(miClose.getActionCommand( ))) doClose( ); else if (newEvent.getActionCommand( ).equals(miSave.getActionCommand( ))) doSave( ); else if (newEvent.getActionCommand( ).equals(miSaveAs.getActionCommand( ))) doSaveAs( ); else if (newEvent.getActionCommand( ).equals(miUndo.getActionCommand( ))) doUndo( ); else if (newEvent.getActionCommand( ).equals(miCut.getActionCommand( ))) doCut( ); else if (newEvent.getActionCommand( ).equals(miCopy.getActionCommand( ))) doCopy( ); else if (newEvent.getActionCommand( ).equals(miPaste.getActionCommand( ))) doPaste( ); else if (newEvent.getActionCommand( ).equals(miClear.getActionCommand( ))) doClear( ); else if (newEvent.getActionCommand( ).equals(miSelectAll.getActionCommand( ))) doSelectAll( ); } public void doNew( ) { // Eine Reaktion auf die Wahl der einzelnen Menuoptionen ist im vorliegenden // Beispiel nicht festgelegt. } public void doOpen( ) { } public void doClose( ) { } public void doSave( ) { } public void doSaveAs( ) { } public void doUndo( ) { } [email protected] public void doCut( ) { } public void doCopy( ) { } public void doPaste( ) { } public void doClear( ) { } public void doSelectAll( ) { } public static void main(String args[]) { new application1( ); } } // File: AboutBox.java import java.awt.*; import java.awt.event.*; public class AboutBox extends Frame implements ActionListener { protected Button okButton; protected Label aboutText; public AboutBox( ) { super( ); this.setLayout(new BorderLayout(15, 15)); this.setFont(new Font ("SansSerif", Font.BOLD, 14)); aboutText = new Label ("© [email protected]"); Panel textPanel = new Panel(new FlowLayout(FlowLayout.CENTER, 15, 15)); textPanel.add(aboutText); this.add (textPanel, BorderLayout.NORTH); okButton = new Button("OK"); Panel buttonPanel = new Panel(new FlowLayout(FlowLayout.CENTER, 15, 15)); buttonPanel.add (okButton); okButton.addActionListener(this); this.add(buttonPanel, BorderLayout.SOUTH); } [email protected] public void actionPerformed(ActionEvent newEvent) { setVisible(false); } } [email protected] Eine Standardaufgabe in vielen Applikationen ist die Wahl einer Datei in einem Auswahlfenster mit dem Ziel, diese Datei zu lesen bzw. in diese Datei zu schreiben. FileChooser Demo import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.*; public class FileChooserDemo extends JFrame { static private final String newline = "\n"; public FileChooserDemo() { super("FileChooserDemo"); // mehrzeiliges Textfeld final JTextArea log = new JTextArea(5,20); log.setMargin(new Insets(5,5,5,5)); log.setEditable(false); JScrollPane logScrollPane = new JScrollPane(log); // Initialisierung des FileChooser final JFileChooser fc = new JFileChooser(); // Schaltfläche: Open a File ImageIcon openIcon = new ImageIcon("images/open.gif"); JButton openButton = new JButton("Open a File", openIcon); openButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(FileChooserDemo.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); //this is where a real application would open the file. log.append("Opening: " + file.getName() + "." + newline); } else { log.append("Open command cancelled by user." + newline); } } }); // Schaltfläche: Save a File ImageIcon saveIcon = new ImageIcon("images/save.gif"); JButton saveButton = new JButton("Save a File", saveIcon); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int returnVal = fc.showSaveDialog(FileChooserDemo.this); if (returnVal == JFileChooser.APPROVE_OPTION) { [email protected] File file = fc.getSelectedFile(); //Pfad zum Speichern der Datei. log.append("Saving: " + file.getName() + "." + newline); } else { log.append("Save command cancelled by user." + newline); } } }); // Layout: Schaltflächen innerhalb eines Panels JPanel buttonPanel = new JPanel(); buttonPanel.add(openButton); buttonPanel.add(saveButton); // Focusreihenfolge der Schaltflächen openButton.setNextFocusableComponent(saveButton); saveButton.setNextFocusableComponent(openButton); // Frame mit Schaltflächen und Textfeld Container contentPane = getContentPane(); contentPane.add(buttonPanel, BorderLayout.NORTH); contentPane.add(logScrollPane, BorderLayout.CENTER); } public static void main(String[] args) { JFrame frame = new FileChooserDemo(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } } [email protected]