P
PaulK
Gast
Hallo an alle,
erstmal zu Situation: Ich bin dabei, ein Programm zum Überpüfen, ob eine Zahl prim ist, zu schreiben. Das Ganze wird in 2 Dateien (GUI und Algorithmus) und mit der BigInteger-Klasse realisisiert.
Um dem Benutzer eine Abschätzung der Rechenzeit zu ermöglichen, hab ich eine jprogressbar eingebaut. Allerdings schaffe ich es nicht, den value() dieser aus der 2. Datei heraus zu ändern. Mein zweites Problem ist, dass die Progressbar erst nach dem kompletten Schleifendurchlauf aktualisiert würde. Ich habe dazu viel gelesen und halte es für sinnvoll, den Algorithmus in einen extra Thread auszulagern. Allerdings weiß ich nicht, wie :cry:. Ich hab viel rumprobiert, bin aber zu keiner funktionierenden Lösung gekommen.
Ich würde mich freuen, wenn mir jemand einen Ansatz (auch mit Code :wink geben könnte, wie ich mein Programm verändern muss, damit die progressbar richtig funktioniert.
PS: Der Algorithmus an sich ist erstmal nur schnell "hingeschmiert" und noch gar nicht optimiert, aber um den geht es ja nicht...
mfG PaulK
GUI:
Algorithmus:
erstmal zu Situation: Ich bin dabei, ein Programm zum Überpüfen, ob eine Zahl prim ist, zu schreiben. Das Ganze wird in 2 Dateien (GUI und Algorithmus) und mit der BigInteger-Klasse realisisiert.
Um dem Benutzer eine Abschätzung der Rechenzeit zu ermöglichen, hab ich eine jprogressbar eingebaut. Allerdings schaffe ich es nicht, den value() dieser aus der 2. Datei heraus zu ändern. Mein zweites Problem ist, dass die Progressbar erst nach dem kompletten Schleifendurchlauf aktualisiert würde. Ich habe dazu viel gelesen und halte es für sinnvoll, den Algorithmus in einen extra Thread auszulagern. Allerdings weiß ich nicht, wie :cry:. Ich hab viel rumprobiert, bin aber zu keiner funktionierenden Lösung gekommen.
Ich würde mich freuen, wenn mir jemand einen Ansatz (auch mit Code :wink geben könnte, wie ich mein Programm verändern muss, damit die progressbar richtig funktioniert.
PS: Der Algorithmus an sich ist erstmal nur schnell "hingeschmiert" und noch gar nicht optimiert, aber um den geht es ja nicht...
mfG PaulK
GUI:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class pz_GUI extends JFrame {
// Anfang Variablen
private JLabel jLabel1 = new JLabel();
private JTextField txtZahl = new JTextField();
private JButton cmdPruefen = new JButton();
private JScrollPane jScrollPanetxtAusgabe = new JScrollPane();
private JTextArea txtAusgabe = new JTextArea("");
private JButton cmdEnde = new JButton();
private JProgressBar pgbFortschritt = new JProgressBar();
pz_BigInt p = new pz_BigInt();
// Ende Variablen
public pz_GUI(String title) {
// Frame-Initialisierung
super(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) { System.exit(0); }
});
int frameWidth = 843;
int frameHeight = 267;
setSize(frameWidth, frameHeight);
setTitle("Primzahlen");
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
jLabel1.setBounds(8, 10, 30, 13);
jLabel1.setText("Zahl:");
jLabel1.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
cp.add(jLabel1);
txtZahl.setBounds(43, 8, 782, 21);
txtZahl.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
txtZahl.setText("");
txtZahl.setHorizontalAlignment(4);
cp.add(txtZahl);
cmdPruefen.setBounds(609, 39, 217, 22);
cmdPruefen.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
cmdPruefen.setText("auf Primzahl überprüfen");
cp.add(cmdPruefen);
cmdPruefen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
cmdPruefenActionPerformed(evt);
}
});
cmdEnde.setBounds(610, 199, 217, 23);
cmdEnde.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
cmdEnde.setText("Beenden");
cp.add(cmdEnde);
cmdEnde.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
cmdEndeActionPerformed(evt);
}
});
pgbFortschritt.setBounds(8, 72, 817, 16);
cp.add(pgbFortschritt);
jScrollPanetxtAusgabe.setBounds(8, 97, 818, 91);
txtAusgabe.setFont (new Font("MS Sans Serif", Font.BOLD, 11));
txtAusgabe.setText("Copyright © Richard Schwark 2007\n");
txtAusgabe.setEditable(false);
jScrollPanetxtAusgabe.setViewportView(txtAusgabe);
cp.add(jScrollPanetxtAusgabe);
// Ende Komponenten
setResizable(false);
setVisible(true);
}
// Anfang Ereignisprozeduren
public void cmdPruefenActionPerformed(ActionEvent evt) {
txtAusgabe.setText(txtAusgabe.getText() + "\n" + p.istPrim(txtZahl.getText()));
}
public void cmdEndeActionPerformed(ActionEvent evt) {
System.exit(0);
}
// Ende Ereignisprozeduren
public static void main(String[] args) {
new pz_GUI("pz_GUI");
}
}
Algorithmus:
Code:
import java.math.BigInteger;
public class pz_BigInt {
public String istPrim (String strZahl) {
BigInteger Zahl = new BigInteger(strZahl);
BigInteger Zwei = new BigInteger("2");
BigInteger Drei = new BigInteger("3");
BigInteger Hundert = new BigInteger("100");
BigInteger Rest = new BigInteger("0");
BigInteger i = new BigInteger("0");
BigInteger Haelfte = new BigInteger("0");
BigInteger Prozent = new BigInteger("0");
BigInteger pzI = new BigInteger("0");
int intProzent=0;
Haelfte=Zahl.add(BigInteger.ONE); // SchleifenEnde
Haelfte=Zahl.divide(Zwei);
Rest=Zahl.mod(Zwei); // Rest der Division
if (Rest.equals(BigInteger.ZERO)) { // -> gerade Zahlen aussortieren
if (Zahl.compareTo(Zwei)==0) { // Zahl=2
return "Primzahl: "+strZahl+"!";
} else {
return "Keine Primzahl, da "+strZahl+" / 2 = "+Zahl.divide(Zwei)+"!";
}
} else {
i=Drei;
while (i.compareTo(Haelfte) != 1) {
Rest=Zahl.mod(i);
if (Rest.equals(BigInteger.ZERO)) {
return "Keine Primzahl, da "+strZahl+" / "+i+" = "+Zahl.divide(i)+"!";
}
pzI=i.multiply(Hundert);
Prozent=pzI.divide(Haelfte);
intProzent=Prozent.intValue();
// pgbFortschritt.setValue(intProzent);
i=i.add(Zwei);
}
if (Zahl.compareTo(BigInteger.ONE)!=0) { // Zahl != 1 (keine Primzahl)
return "Primzahl: "+strZahl+"!";
}else {
return "Keine Primzahl: "+strZahl+"!";
}
}
}
}