Verteilte Software - Java - Applets 1 java.lang.Object java.awt.Component paint(Graphics g) java.awt.Container paint(Graphics g) java.awt.Window java.awt.Panel java.awt.Frame java.awt.Applet init() start() stop() destroy() Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 2 import import import import java.awt.*; java.awt.event.*; java.applet.Applet; Display; public class Oszi extends Applet implements Runnable, ActionListener, ItemListener, TextListener, AdjustmentListener { Frame f; Thread change_phi, change_phi_stop; Display disp; Button b[]; Scrollbar sb; Checkbox cbd, cbl; TextField tf; boolean dyn; // Dynamik int phi, // Phasenwinkel fw, // Funktionsauswahl art; // Darstellungsart public void init() { phi = 0; fw = 1; art = 0; dyn = false; change_phi = change_phi_stop = null; setBackground(Color.lightGray); setLayout(new BorderLayout()); // oben Panel oben = new Panel(); oben.setLayout(new FlowLayout(FlowLayout.CENTER)); b = new Button[5]; b[0] = new Button(" sin( x) "); b[1] = new Button(" sin(2x) "); b[2] = new Button("sin( x) + 1/3 sin(3x)"); b[3] = new Button("sin(2x) + 1/3 sin(6x)"); for ( int i = 0; i <= 3; i++) { b[i].addActionListener(this); oben.add(b[i]); } add(oben, BorderLayout.NORTH); //links Panel links = new Panel(); b[4] = new Button("Aus"); b[4].addActionListener(this); links.add(b[4]); add(links, BorderLayout.WEST); //zentral disp = new Display(); add(disp, BorderLayout.CENTER ); Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 3 //rechts sb = new Scrollbar(Scrollbar.VERTICAL, 0, 20, 0, 380); sb.addAdjustmentListener(this); sb.setUnitIncrement(3); sb.setBlockIncrement(30); add(sb, BorderLayout.EAST); //unten Panel unten = new Panel(); cbd = new Checkbox("Dynamik"); cbd.addItemListener(this); unten.add(cbd); cbl = new Checkbox("Lissajous"); cbl.addItemListener(this); unten.add(cbl); unten.add(new Label("Phasenwinkel")); tf = new TextField("0",3); tf.addTextListener(this); unten.add(tf); unten.add(new Label("°")); add(unten, BorderLayout.SOUTH); setSize(460,420); // Zusatzfenster int ausw, ph; f = new Frame(); f.setTitle("Display Function"); try { ausw = Integer.parseInt(getParameter("Auswahl")); } catch (NumberFormatException e) {ausw = 1;} try { ph = Integer.parseInt(getParameter("Phase")); } catch (NumberFormatException e) {ph = 0;} if (ausw < 1) ausw = 1; else ausw = ((ausw - 1) % 8) + 1; ph %= 360; if (phi < 0) ph += 360; f.add("Center", new Display(ausw, ph)); } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 4 public void start() { if (change_phi == null) { change_phi = change_phi_stop = new Thread(this); change_phi.start(); } public void run() { Integer i = new Integer(0); while (change_phi == change_phi_stop) { if (dyn && fw != 0) { disp_new(); phi++; phi %= 360; sb.setValue(phi); tf.setText(i.toString(phi)); try { change_phi.sleep(100); } catch(InterruptedException e){}; } else try { change_phi.sleep(500); } catch(InterruptedException e){}; } f.setSize( 420, 400 ); f.setVisible(true); } public void stop() { change_phi_stop = null; try { change_phi.join(); } catch (InterruptedException e) { System.out.print(e); } change_phi = null; f.setVisible(false); } public void destroy() { f.dispose(); } } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 5 public void itemStateChanged (ItemEvent e) { Object obj = e.getSource(); if (obj == cbl) { if (cbl.getState()) art = 4; else art = 0; if (fw != 0) disp_new(); } if (obj == cbd) { if (cbd.getState()) dyn = true; else dyn = false; } } public void textValueChanged (TextEvent e) { Object obj = e.getSource(); if (obj == tf) { phi = Integer.parseInt(tf.getText()); if (phi < 0) phi = 0; if (phi > 360) phi = 360; sb.setValue(phi); disp_new(); } } public void adjustmentValueChanged (AdjustmentEvent e) { Object obj = e.getSource(); if (obj == sb) { phi = sb.getValue(); tf.setText(new Integer(phi).toString()); disp_new(); } } public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj instanceof Button) { for (int i = 0; i < 4; i++) if (obj == b[i]) fw = i + 1; if (obj == b[4]) { fw = 0; art = 0; phi = 0; dyn = false; tf.setText("0"); sb.setValue(phi); cbd.setState(false); cbl.setState(false); } disp_new(); } } void disp_new() { disp.new_function(art + fw, phi); disp.repaint(); } } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 6 <HTML> <HEAD> <TITLE>Oszilloscop</TITLE> </HEAD> <BODY> <h1>Oszilloscop</h1> <P>Mit einem Oszilloscop k&ouml;nnen Sie die Spannungsverl&auml;ufe als Funktion der Zeit beobachten</P> <P> <HR ALIGN="CENTER"> <APPLET CODE="Oszi.class" WIDTH=500 HEIGHT=400 > <PARAM NAME=Auswahl VALUE=3> <PARAM NAME=Phase VALUE=210> </APPLET> <HR ALIGN="CENTER"> <p> In der obigen Nachbildung eines Oszilloscops k&ouml;nnen Sie zwischen vier verschieden Spannungsverl&auml;ufen w&auml;hlen. Die Darstellung kann als Zeitfunktion oder als Lissajous-Figur &uuml;ber der Funktion sin(x) erfolgen. In der Zeitdarstellung k&ouml;nnen Sie mit der linken Maustaste einen Me&szlig;strahl zur Pegelbestimmung ausl&ouml;&szlig;en. In der Betriebsart "Dynamik" wird der Phasenwikel um 10 Grad je Sekunde verschoben. <p> In einem zus&auml;tzlichen Applet-Fenster wir die Funktion sin(x) + 1/3 sin(3x) (Auswahl = 3) bei einer Phasenverschiebung von 210 Grad (Phase = 210) dargestellt. In diesem Fenster ist die Funktionalit&auml;t auf das Ausmessen von von Pegelwerten beschr&auml;nkt. </BODY> </HTML> Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 7 Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 8 <HTML> <HEAD> <TITLE>Blakenkreuz</TITLE> </HEAD> <BODY> <h1>Balkenkreuz</h1> <P>In zwei Applets verschieben Scrollbars die Balken horizontal bzw. vertikal.</P> <P> <HR ALIGN="CENTER"> <APPLET CODE="Hbar.class" NAME="HBAR" WIDTH=300 HEIGHT=200 > </APPLET> miteinander kommunizierende Applets <APPLET CODE="Vbar.class" NAME="VBAR" WIDTH=200 HEIGHT=250 > </APPLET> </BODY> </HTML> Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 9 java.applet.Applet getAppletContext() 1 1 1 1 1 java.applet.AppletContext 2 1 1 1 BarScreen HBar addVbar() VValueChanged() 1 1 1 1 1 1 1 ScrollBar <<uses>> 1 VBar addHbar() HValueChanged() <<uses>> 2 <<implements>> 1 1 <<interface>> AdjustmentListener <<implements>> Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 10 import java.awt.*; public class BarScreen extends Canvas { int hvalue, vvalue; public BarScreen() { hvalue = vvalue = 0; setBackground(Color.blue); } public void setHValue(int h) { hvalue = h; } public void setVValue(int v) { vvalue = v; } public void paint( Graphics g ) { g.setColor(Color.yellow); g.fillRect(hvalue * (getSize().width - 20) / 100, 0, 20, getSize().height); g.fillRect(0, vvalue * (getSize().height - 20) / 100, getSize().width, 20); } } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 11 import import import import import java.awt.*; java.awt.event.*; java.applet.*; BarScreen; Vbar; public class Hbar extends Applet implements AdjustmentListener { int hvalue; Scrollbar hsb; BarScreen bs; AppletContext ac; Vbar vbar_source, vbar_dest; public void init() { hvalue = 0; setBackground(Color.blue); setLayout(new BorderLayout()); //unten hsb = new Scrollbar (Scrollbar.HORIZONTAL, 0, 20, 0, 120); hsb.addAdjustmentListener(this); hsb.setUnitIncrement(1); hsb.setBlockIncrement(10); add(hsb, BorderLayout.SOUTH); setSize(300, 300); //zentral bs = new BarScreen(); add(bs, BorderLayout.CENTER ); ac = getAppletContext(); vbar_source = (Vbar) ac.getApplet("VBAR"); if (vbar_source != null) vbar_source.addHbar(this); vbar_dest = null; } public void addVbar(Vbar vbar) { vbar_dest = vbar; } public void VValueChanged(int vv) { bs.setVValue(vv); bs.repaint(); } public void adjustmentValueChanged (AdjustmentEvent e) { Object obj = e.getSource(); if (obj == hsb) { hvalue = hsb.getValue(); bs.setHValue( hvalue ); if(vbar_dest != null) vbar_dest.HValueChanged(hvalue); bs.repaint(); } } } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java - Applets 12 import import import import import java.awt.*; java.awt.event.*; java.applet.*; BarScreen; Hbar; public class Vbar extends Applet implements AdjustmentListener { int vvalue; Scrollbar vsb; BarScreen bs; AppletContext ac; Hbar hbar_source, hbar_dest; public void init() { vvalue = 0; setBackground(Color.blue); setLayout(new BorderLayout()); //links vsb = new Scrollbar (Scrollbar.VERTICAL, 0, 20, 0, 120); vsb.addAdjustmentListener(this); vsb.setUnitIncrement(1); vsb.setBlockIncrement(10); add(vsb, BorderLayout.WEST); setSize(300, 300); //zentral bs = new BarScreen(); add(bs, BorderLayout.CENTER ); ac = getAppletContext(); hbar_source = (Hbar) ac.getApplet("HBAR"); if (hbar_source != null) hbar_source.addVbar(this); hbar_dest = null; } public void addHbar(Hbar hbar) { hbar_dest = hbar; } public void HValueChanged(int hv) { bs.setHValue(hv); bs.repaint(); } public void adjustmentValueChanged (AdjustmentEvent e) { Object obj = e.getSource(); if (obj == vsb) { vvalue = vsb.getValue(); bs.setVValue( vvalue ); if (hbar_dest != null) hbar_dest.VValueChanged(vvalue); bs.repaint(); } } } Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik