Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Grundlagen der Programmierung 2 SS 2005 - Datei Prime.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Prime extends JFrame
{
    JTextField numberEntry;

    public Prime()
    {
        super("Prime Checker");
        
        Container c = this.getContentPane();
        
        // Layout setzen
        c.setLayout(new FlowLayout(FlowLayout.CENTER));        

        // Eingabefeld und Label im Zentrum erzeugen.
        c.add(new JLabel("Enter a Number: ", JLabel.CENTER), BorderLayout.NORTH);
        numberEntry = new JTextField("", 15);
        c.add(numberEntry);

        // PrimeCalculator wird ActionListener des Eingabefeldes.
        numberEntry.addActionListener(new PrimeCalculator());
        
        // Fenster anzeigen
        setSize(200,100);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String args[])
    {
        JFrame f = new Prime();
    }
}


class PrimeCalculator implements ActionListener
{
    // Innere Klasse, die den Thread implementiert.
    class PrimeChecker extends Thread
    {
        // Die Nummer, die ueberprueft werden soll.
        private long number;
        
        // Dem Konstruktor wird die zu prüfende Zahl als Parameter mitgegeben.
        PrimeChecker(long theNumber)
        {
            number = theNumber;
        }

        public void run()
        {
            // Der Berechnungsteil der früheren actionPerformed()-Funktion.
            long nextprime;

            // Wenn's eine Primzahl ist, sag es.
            if (isPrime(number))
            {
                JOptionPane.showMessageDialog(null, 
                        number + " is a prime.",
                        "Prime Calculation", JOptionPane.INFORMATION_MESSAGE);
            }
            else
            {
                // War keine. Rechne die nächste Primzahl aus.
                nextprime = number + 1;
                if (nextprime % 2 == 0) // Grade Zahlen testen wir gar nicht
                                        // erst.
                    nextprime++;

                while (!isPrime(nextprime))
                    nextprime += 2;

                JOptionPane.showMessageDialog(null, 
                        number + " is not a prime.\nNext prime is " + nextprime+".",
                        "Prime Calculation", JOptionPane.INFORMATION_MESSAGE);

            }
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        // Die Abfrage aus den Eingabefeldern sollte man besser vor
        // dem Thread-Start durchführen, da sie sonst bereits vom
        // Benutzer überschrieben sein könnten, wenn der Thread
        // tatsächlich startet.

        long number;

        // Ermittle die Zahl, die der Benutzer eingab.
        String entry = ((JTextField) e.getSource()).getText();

        try
        {
            number = Long.parseLong(entry);
        }
        catch (NumberFormatException ex)
        {
            JOptionPane.showMessageDialog(null, 
                    "Illegal Number!",
                    "Error!", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // Das Starten des Thread. Man erzeugt hier
        // ein neues Objekt der inneren Klasse und übergibt dabei auch
        // gleich die Kopie der Zahl, die zu prüfen ist, auf sichere
        // Weise. Der Teil der Thread-Verarbeitung ist
        // leicht vom Nicht-Thread-Teil zu trennen.

        Thread t = new PrimeChecker(number);
        t.start();

    }

    boolean isPrime(long number)
    {
        // Prüft, ob number eine Primzahl ist.
        long divisor;

        if (number < 0) // Negativ. Berechne entsprechende Positive Zahl.
            number = -number;
        if (number < 4) // 1, 2 und 3 sind Primzahlen.
            return true;
        if (number % 2 == 0) // Alle grade Zahlen nicht.
            return false;

        divisor = 3; // Ungerade Zahlen ab 3 als Teiler ausprobieren.

        while (divisor * divisor <= number)
        {
            if (number % divisor == 0)
                return false;
            divisor = divisor + 2;
        }

        return true;
    }
}

Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 27.05.2005