Newtons Wiege, Quelltext

Der Quelltext dieses Java-Applets umfasst zwei Klassen, NWiege und Schaltfläche. Die Klasse NWiege definiert das eigentliche Applet und enthält eine innere Klasse Zeichenfläche. Die Klasse Schaltfläche ist eine Hilfsklasse, die den recht komplizierten Umgang mit dem Layout-Manager GridBagLayout erleichtern soll.

Klasse NWiege

// Java-Applet NWiege
// Newtons Wiege (Demonstration von Impuls- und Energieerhaltungssatz)
// Kompilierung mit J2SDK 1.6.0
// Walter Fendt
// 03.11.1997 - 24.03.2009
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NWiege extends JApplet implements Runnable {
//-----------------------------------------------------------------------------	
// Konstanten
//-----------------------------------------------------------------------------
  final int N = 5;                          // Zahl der Pendel
  final int R = 20;                         // Radius Pendelkörper (Pixel)
  final int R2 = 2*R;                       // Durchmesser Pendelkörper (Pixel)
  final int L = 200;                        // Pendellänge (Pixel)
  final double A = 0.4;                     // Amplitude (Bogenmaß)
  final double T = 2;                       // Schwingungsdauer (s)
  final double OMEGA = 2*Math.PI/T;         // Kreisfrequenz (1/s)  
  final Color FZF = Color.yellow;           // Hintergrundfarbe Zeichenfläche
  final Color FSF = Color.green;            // Hintergrundfarbe Schaltfläche
  final Font SANSSERIF                      // Logischer Font
    = new Font("SansSerif",Font.BOLD,12);
//----------------------------------------------------------------------------- 
// Attribute
//-----------------------------------------------------------------------------
  Container cp;                             // Content Pane
  int breite, höhe, höhe0;                  // Abmessungen (Pixel)
  Zeichenfläche zf;                         // Zeichenfläche
  Schaltfläche sf;                          // Schaltfläche
  JComboBox ch;                             // Auswahlfeld

  int ax, ay;                               // Aufhängung des linken Pendels
  double phi;                               // Phase (Bogenmaß)
  Thread thr;                               // Prozess für Animation
  double t;                                 // Zeit (s)
//-----------------------------------------------------------------------------
// Weitere Methoden
//-----------------------------------------------------------------------------
  // Start-Methode:
  public void start () {
    cp = getContentPane();                  // Container für Komponenten
    cp.setLayout(null);                     // Hartes Layout (Pixelangaben)
    Dimension dim = getSize();              // Abmessungen (aus HTML-Datei)
    breite = dim.width;                     // Breite (Pixel) 
    höhe = dim.height;                      // Gesamthöhe (Pixel)
    höhe0 = 280;                            // Höhe der Zeichenfläche (Pixel)
    ay = 40;                                // Aufhängung, unterer Rand 
    ax = breite/2-(N-1)*R;                  // Aufhängung (linkes Pendel)
    zf = new Zeichenfläche();               // Zeichenfläche (innere Klasse) 
    zf.setBackground(FZF);                  // Hintergrundfarbe Zeichenfläche
    zf.setBounds(0,0,breite,höhe0);         // Position/Abmessungen Zeichenfläche
    cp.add(zf);                             // Zeichenfläche hinzufügen
    sf = new Schaltfläche(FSF,SANSSERIF);   // Schaltfläche
    sf.setBounds(0,höhe0,breite,höhe-höhe0);// Position/Abmessungen Schaltfläche
    String text                             // Zeichenkette für Label 
      = "Zahl der ausgelenkten Kugeln:";
    sf.hinzufügen(new JLabel(text),         // Label hinzufügen
      FSF,0,0,1,10,10,10,0);
    ch = new JComboBox();                   // Auswahlfeld
    for (int i=1; i<=N; i++)                // Felder für die Zahl ...
      ch.addItem("  "+i+"  ");              // ... der ausgelenkten Kugeln
    ch.setSelectedIndex(1);                 // Voreinstellung: Zwei Kugeln ausgelenkt
    sf.hinzufügen(ch,                       // Auswahlfeld hinzufügen
      Color.white,1,0,1,10,10,10,10);
    text = "©  W. Fendt 1997";              // Zeichenkette für Label
    sf.hinzufügen(new JLabel(text),         // Label hinzufügen
      FSF,2,0,1,10,30,10,10);
    cp.add(sf);                             // Schaltfläche hinzufügen 
    thr = new Thread(this);                 // Prozess für Animation 
    thr.start();                            // Prozess starten
    }
  // Stopp-Methode:
  public void stop () {
    thr = null;                             // Prozess für Garbage Collection freigeben 
    cp.removeAll();                         // Komponenten entfernen
    }
  // Methode für Animation (Endlosschleife):
  public void run () {
    long t0, t1;
    t0 = System.currentTimeMillis();        // Zeit in ms
    sf.repaint();                           // Schaltfläche neu zeichnen
    while (thr == Thread.currentThread()) { // Solange Prozess thr aktiv ...
      zf.repaint();                         // ... Zeichenfläche neu zeichnen
      try {Thread.sleep(50);}               // ... 50 ms Unterbrechung 
      catch (InterruptedException ie) {}
      t1 = System.currentTimeMillis();      // ... Zeit in ms
      t += (t1-t0)/1000.0;                  // ... Zeit seit der letzten Ablesung in s
      t0 = t1;                              // ... Zeit in ms
      }
    }
  // Einzelnes Pendel:
  // g ... Grafik-Kontext
  // i ... Nummer (0 bis N-1)
  void pendel (Graphics g, int i) {
    while (t >= T) t -= T;                  // Bedingung 0 <= t < T erzwingen
    phi = A*Math.cos(OMEGA*t);              // Phase (Bogenmaß) 
    int k = ch.getSelectedIndex()+1;        // Zahl der ausgelenkten Kugeln 
    int px, py;                             // Mittelpunktskoordinaten der Kugel 
    boolean links = (t < T/4 || t >= 3*T/4);// Auslenkung nach links    
    if ((links && i < k)                    // Kugel nach links ausgelenkt  
    || (!links && i >= N-k)) {              // Kugel nach rechts ausgelenkt
      px = (int)Math.round(ax+i*R2-L*Math.sin(phi));  // x-Koordinate Kugelmittelpunkt
      py = (int)Math.round(ay+L*Math.cos(phi));       // y-Koordinate Kugelmittelpunkt
      }
    else {px = ax+i*R2; py = ay+L;}         // Kugel in Ruhe
    g.setColor(Color.black);                // Faden 
    g.drawLine(ax+i*R2,ay,px,py); 
    g.setColor(Color.blue);                 // Pendelkörper (Kreisfläche) 
    g.fillOval(px-R,py-R,R2,R2); 
    g.setColor(Color.black);                // Pendelkörper (Kreisrand) 
    g.drawOval(px-R,py-R,R2,R2);
    }
    
  // --------------------------------------------------------------------------
  // Innere Klasse Zeichenfläche:
 
  class Zeichenfläche extends JPanel {
    // Grafik-Ausgabe:
    // g ... Grafik-Kontext
    public void paint (Graphics g) {
      super.paint(g);                       // Hintergrund zeichnen
      g.setColor(Color.black);              // Aufhängung zeichnen 
      g.fillRect(breite/2-(N+1)*R,ay-4,(N+1)*R2,4); 
      for (int i=0; i<N; i++) pendel(g,i);  // Einzelne Pendel zeichnen
      }
      
    } // Ende Zeichenfläche

  } // Ende NWiege

Klasse Schaltfläche

// Java-Klasse Schaltfläche
// Kompilierung mit JDK 1.6.0
// Walter Fendt
// 01.12.2001 - 24.03.2009
import java.awt.*;
import javax.swing.*;

public class Schaltfläche extends JPanel {
//-----------------------------------------------------------------------------	
// Attribute
//-----------------------------------------------------------------------------
  Font zeichensatz;                    // Zeichensatz
//-----------------------------------------------------------------------------
// Konstruktoren
//-----------------------------------------------------------------------------
  // Konstruktor:
  public Schaltfläche (Color hintergrundfarbe, Font zeichensatz) {
    setBackground(hintergrundfarbe);
    this.zeichensatz = zeichensatz;
    setLayout(new GridBagLayout());
    }
//-----------------------------------------------------------------------------    
// Weitere Methoden
//-----------------------------------------------------------------------------
  // Hinzufügen einer Komponente:
  void hinzufügen (JComponent komponente, Color hintergrundfarbe, 
  Color vordergrundfarbe, Font zeichensatz, 
  int spalte, int zeile, int breite, 
  int abstandOben, int abstandLinks, int abstandUnten, int abstandRechts) {
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = spalte; c.gridy = zeile; 
    c.gridwidth = breite; c.gridheight = 1;
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.anchor = GridBagConstraints.CENTER;
    c.weightx = breite; c.weighty = 1;
    c.insets = new Insets(abstandOben,abstandLinks,abstandUnten,abstandRechts);
    ((GridBagLayout)getLayout()).setConstraints(komponente,c);
    komponente.setFont(zeichensatz); 
    komponente.setBackground(hintergrundfarbe);
    komponente.setForeground(vordergrundfarbe);
    add(komponente);
    }
  // Hinzufügen einer Komponente, vereinfachte Variante:
  // Vordergrundfarbe schwarz, voreingestellter Zeichensatz
    
  void hinzufügen (JComponent komponente, Color hintergrundfarbe, 
  int spalte, int zeile, int breite,
  int abstandOben, int abstandLinks, int abstandUnten, int abstandRechts) {
    hinzufügen(komponente,hintergrundfarbe,Color.black,zeichensatz,
    spalte,zeile,breite,abstandOben,abstandLinks,abstandUnten,abstandRechts);
    }
    
  } // Ende Schaltfläche
 

 

URL: http://www.walter-fendt.de/quelltexte/nwiege_qt.htm
© Walter Fendt, 3. November 1997
Letzte Änderung: 2. April 2009