Primzahlentabelle, Quelltext

Der Quelltext dieses Java-Applets umfasst zwei Klassen: Primzahlen und Schaltfläche.

Klasse Primzahlen

// Java-Applet Primzahlen (Primzahlentabelle) // Kompilierung mit J2SDK 1.6.0 // Walter Fendt // 12.10.2003 - 01.04.2009 // Das Applet zeigt eine Primzahlentabelle, die 1000 Zahlen umfasst. In jeder // Tabellenzeile stehen 10 Zahlen. Die Obergrenze (durch 10 teilbar, maximal // 1.000.000.000.000) kann über ein Eingabefeld eingestellt werden. Da die // Tabelle viel Platz einnimmt, wird sie in ein Rollbalkensystem (ScrollPane) // eingebaut. Mithilfe der Rollbalken lässt sich der sichtbare Teilbereich der // Tabelle auswählen. Bewegt man den Mauszeiger zu einer Zahl der Tabelle, so // erscheint kurzzeitig die Aussage, dass es sich um eine Primzahl handelt, oder // die Primfaktorenzerlegung der Zahl.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Primzahlen extends JApplet implements ActionListener, MouseMotionListener {
//----------------------------------------------------------------------------- // Konstanten //-----------------------------------------------------------------------------
final Color FZF = Color.yellow; // Hintergrundfarbe Zeichenfläche final Color FARBE_PRIM = Color.orange; // Farbe für Primzahlen final Color FSF = Color.green; // Hintergrundfarbe Schaltfläche final Font SANSSERIF // Logischer Font = new Font("SansSerif",Font.BOLD,12); final int HÖHE_TITEL = 40; // Höhe der Tabellenüberschrift (Pixel) final int BREITE_ZF = 1100; // Breite der Zeichenfläche (Pixel) final int HÖHE_ZF = 2001; // Höhe der Zeichenfläche (Pixel) final int HÖHE_RB = 320; // Höhe des Rollbalken-Systems (Pixel) final int HÖHE_ZELLE = HÖHE_ZF/100; // Höhe einer Tabellenzelle (Pixel)
//----------------------------------------------------------------------------- // Attribute //-----------------------------------------------------------------------------
long n0; // Untergrenze der Tabelle minus 1 boolean[][] prim; // Array mit Wahrheitswerten für Primzahl int breite, höhe; // Abmessungen des Applets (Pixel) JLabel lbTitel; // Tabellenüberschrift Zeichenfläche zf; // Zeichenfläche (Tabelle) JScrollBar scrH, scrV; // Rollbalken horizontal/vertikal int breiteZelle; // Breite einer Tabellenzelle (Pixel) Schaltfläche sf; // Schaltfläche JTextField tf; // Eingabefeld für Obergrenze
//----------------------------------------------------------------------------- // Methoden //-----------------------------------------------------------------------------
// Start-Methode:
public void start () { Container cp = getContentPane(); // Container für Komponenten cp.setLayout(null); // Hartes Layout (Pixelangaben) n0 = 0L; // Untergrenze minus 1 prim = new boolean[100][10]; // Array mit Wahrheitswerten für Primzahl updateFlags(); // Wahrheitswerte ermitteln Dimension dim = getSize(); // Abmessungen (aus HTML-Datei) breite = dim.width; // Breite (Pixel) höhe = dim.height; // Gesamthöhe (Pixel) lbTitel = new JLabel(titel()); // Tabellenüberschrift lbTitel.setBackground(FSF); // Hintergrundfarbe lbTitel.setOpaque(true); // Undurchsichtig lbTitel.setBounds(0,0,breite,HÖHE_TITEL); // Position und Abmessungen (Pixel) cp.add(lbTitel); // Tabellenüberschrift hinzufügen breiteZelle = 42; // Breite einer Tabellenzelle (Pixel) zf = new Zeichenfläche(); // Zeichenfläche für Tabelle JScrollPane sp = new JScrollPane(zf); // Rollbalkensystem für Tabelle sp.setBounds(0,HÖHE_TITEL,breite,HÖHE_RB); // Position und Abmessungen (Pixel) sp.setHorizontalScrollBarPolicy( // Horizontaler Rollbalken immer sichtbar JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); sp.setVerticalScrollBarPolicy( // Vertikaler Rollbalken immer sichtbar JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrH = sp.getHorizontalScrollBar(); // Horizontaler Rollbalken scrV = sp.getVerticalScrollBar(); // Vertikaler Rollbalken updateRollbalken(); // Rollbalken anpassen cp.add(sp); // Rollbalkensystem (mit Inhalt) hinzufügen sf = new Schaltfläche(FSF,SANSSERIF); // Schaltfläche JLabel lb = new JLabel("Obere Grenze:");// Text links sf.hinzufügen(lb,FZF,0,0,1,10,10,10,10);// Text hinzufügen tf = new JTextField(""+(n0+1000)); // Eingabefeld mit Defaultwert sf.hinzufügen(tf,Color.white,1,0,1,10,10,10,10); // Eingabefeld hinzufügen lb = new JLabel("© W. Fendt 2003"); // Text rechts sf.hinzufügen(lb,FZF,2,0,1,10,200,10,10); // Text hinzufügen int h = HÖHE_TITEL+HÖHE_RB; // Höhe von Überschrift und Tabelle (Pixel) sf.setBounds(0,h,breite,höhe-h); // Position und Abmessungen (Pixel) cp.add(sf); // Schaltfläche hinzufügen tf.addActionListener(this); // Aufpasser für Eingabefeld (Enter-Taste) zf.addMouseMotionListener(this); // Aufpasser für Mausbewegungen tf.requestFocus(); // Cursor in Eingabefeld }
// Überschrift:
String titel () { String s = " Primzahlentabelle ("; // Anfang der Überschrift (Zeichenkette) s += (n0+1)+" bis "+(n0+1000)+")"; // Überschrift ergänzen return s; // Rückgabewert }
// Kleinster Primfaktor: // z ... Gegebene natürliche Zahl (größer als 1) // Falls z nicht größer als 1 ist (Fehler), ist der Rückgabewert 0.
long kleinsterPrimfaktor (long z) { if (z <= 1) return 0; // Fehler, da z > 1 nicht erfüllt long t = 2; // Möglicher Teiler von z while (t*t <= z) { // Teiler bis zur Wurzel aus z testen if (z%t == 0) return t; // Bei Erfolg Teiler ausgeben t++; // Andernfalls weitermachen } return z; // z ausgeben, da Primzahl }
// Überprüfung der Primzahleigenschaft: // z ... Gegebene natürliche Zahl
boolean istPrimzahl (long z) { if (z <= 1) return false; // z <= 1, daher keine Primzahl return (kleinsterPrimfaktor(z) == z); // Bedingung für Primzahl }
// Aktualisierung der Wahrheitswerte für die Primzahleigenschaft:
void updateFlags () { for (int i=0; i<100; i++) // Für alle 100 Tabellenzeilen for (int j=0; j<10; j++) { // Für alle 10 Tabellenspalten long z = n0+10*i+j+1; // Zahl in Tabellenzelle prim[i][j] = istPrimzahl(z); // Wahrheitswert für Primzahleigenschaft } }
// Rollbalken aktualisieren:
void updateRollbalken () { scrH.setUnitIncrement(breiteZelle); // Klick auf Pfeil (horizontal) scrH.setBlockIncrement(2*breiteZelle); // Klick auf Rollbalken (horizontal) scrV.setUnitIncrement(HÖHE_ZF/100); // Klick auf Pfeil (vertikal) scrV.setBlockIncrement(HÖHE_ZF/10); // Klick auf Rollbalken (vertikal) } // ..........................................................................
// Reaktion auf Enter-Taste:
public void actionPerformed (ActionEvent ae) { try { // Zahlenbereich festlegen: String s = tf.getText(); // Obergrenze (als Zeichenkette) long z = Long.parseLong(s); // Umwandlung in Zahl (Typ long) n0 = z-1000; // Untergrenze minus 1 } catch (NumberFormatException nfe) { // Falls sinnlose Eingabe, ... n0 = 0; // ... Untergenze 1 } n0 = Math.max(n0,0); // Positive Untergrenze erzwingen n0 = Math.min(n0,999999999000L); // Zu große Untergrenze verhindern long n = 10*(n0/10); // Falls nötig, n0 auf ein Vielfaches if (n < n0) n0 = n+10; // von 10 aufrunden lbTitel.setText(titel()); // Tabellenüberschrift aktualisieren tf.setText(""+(n0+1000)); // Eventuell Eingabefeld anpassen int stellen = (""+(n0+1000)).length(); // Stellenzahl für Obergrenze breiteZelle = 7*(2+stellen); // Breite einer Tabellenzelle (Pixel) updateFlags(); // Array mit Wahrheitswerten aktualisieren updateRollbalken(); // Rollbalken aktualisieren zf.repaint(); // Zeichenfläche (Tabelle) neu zeichnen }
// Reaktion auf Mausbewegungen:
// Falls sich der Mauszeiger innerhalb der Primzahltabelle befindet, // wird an dieser Stelle für kurze Zeit ein Hinweis (ToolTip) eingeblendet. // Dieser Hinweis enthält entweder die Aussage, dass eine Primzahl vorliegt, // oder die Primfaktorenzerlegung. public void mouseMoved (MouseEvent me) { int x = me.getX(), y = me.getY(); // Position des Mauszeigers boolean innerhalb = (x < 10*breiteZelle); // Position innerhalb der Tabelle? long z = n0+10*(y/HÖHE_ZELLE)+x/breiteZelle+1; // Zahl in der Tabellenzelle if (!innerhalb || z <= 1) { // Kein Hinweis nötig zf.setToolTipText(null); return; } String s = ""+z; // Zahl in Zeichenkette umwandeln long p = kleinsterPrimfaktor(z); z /= p; // Durch kleinsten Primfaktor teilen if (z == 1) s += " ist eine Primzahl."; // Hinweistext für Primzahl else s += " = "+p; // Hinweistext für Zerlegung (Beginn) while (z > 1) { // Solange Zerlegung noch nicht beendet ... p = kleinsterPrimfaktor(z); z /= p; // ... durch kleinsten Faktor teilen s += " \u00b7 "+p; // ... Malpunkt und Faktor ergänzen } zf.setToolTipText(s); // Hinweistext festlegen }
// Nicht benötigte Methode von MouseMotionListener:
public void mouseDragged (MouseEvent me) {} // --------------------------------------------------------------------------
// Innere Klasse Zeichenfläche (Tabelle):
class Zeichenfläche extends JPanel {
// Konstruktor:
Zeichenfläche () { setBounds(0,0,BREITE_ZF,HÖHE_ZF); // Position und Abmessungen (Pixel) setBackground(FZF); // Hintergrundfarbe }
// Grafik-Ausgabe: // g ... Grafik-Kontext
public void paint (Graphics g) { super.paint(g); // Hintergrund zeichnen g.setFont(SANSSERIF); // Zeichensatz FontMetrics fmH // Abmessungen Zeichensatz = getFontMetrics(SANSSERIF); g.setColor(Color.black); // Schriftfarbe schwarz for (int i=0; i<100; i++) // Für alle 100 Zeilen for (int j=0; j<10; j++) { // Für alle 10 Spalten long z = n0+10*i+j+1; // Zahl in Tabellenzelle if (prim[i][j]) { // Falls Primzahl ... g.setColor(FARBE_PRIM); // ... Farbe für Primzahl g.fillRect(j*breiteZelle,i*HÖHE_ZELLE,breiteZelle,HÖHE_ZELLE); // ... Zelle einfärben g.setColor(Color.black); // ... Farbe zurücksetzen } String s = ""+z; // Zahl in Zeichenkette umwandeln int w = fmH.stringWidth(s); // Breite (Pixel) g.drawString(s,(j+1)*breiteZelle-w-8,i*HÖHE_ZELLE+15); // Zahl eintragen } int xRechts = 10*breiteZelle; // Rechter Rand der Tabelle (Pixel) for (int i=0; i<=100; i++) { // Waagrechte Begrenzungslinien int y = i*HÖHE_ZELLE; // y-Koordinate der Linie g.drawLine(0,y,xRechts,y); // Linie zeichnen } int yUnten = 100*HÖHE_ZELLE; // Unterer Rand der Tabelle (Pixel) for (int j=0; j<=10; j++) { // Senkrechte Begrenzungslinien int x = j*breiteZelle; // x-Koordinate der Linie g.drawLine(x,0,x,yUnten); // Linie zeichnen } }
// Bevorzugte Abmessungen der Zeichenfläche:
// Diese Methode wird vom Rollbalkensystem (ScrollPane) benötigt. public Dimension getPreferredSize () { return new Dimension(BREITE_ZF,HÖHE_ZF); } } // Ende Zeichenfläche } // Ende Primzahlen

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/primzahlen_qt.htm
© Walter Fendt, 12. Oktober 2003
Letzte Änderung: 2. April 2009