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.
// 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
// 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