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