Java JButton mehrmalig betätigen / linearen Kongruenzgenerator mit vorigem Wert berechnen

Cybersider

Cadet 3rd Year
Registriert
Aug. 2011
Beiträge
41
Hallo erstmal :)

Ich habe mal ein paar Fragen :D

In meinem Programm soll ich Pseudozufallszahlen, anhand des linearen Kongruenzgenerators erzeugen.
Mein Problem ist, dass sich die Zahl verändern soll (und zwar mit dem wert, der vorher erzeugt wurde), wenn ich den Button nochmal drücke.
Leider weis ich weder, wie ich es hinbekomme, dass er immer den vorherigen Wert in die Gleichung übernimmt, noch, wie ich ein weiteres ActionEvent erzeuge, sodass er beim 2.mal drücken die Gleichung forführt.
Kann mir jemand helfen ?

mfg
Cyber

p.S. Ich hatte gestern schon einen Thread eröffnet, um überhaupt hinter das System des linearen Kongruenzgenerators zu kommen. Hätte ich da einfach weiter schreiben sollen ?
 
Das ActionEvent erzeugst Du, in dem Du einfach erneut auf den Button drückst.

Im ActionEvent überprüftst Du, ob etwas gespeichert wurde (Stichwort: Instanzvariable). Wenn ja, machst Du mit dem Wert weiter und speicherst den neuen Wert wieder ab. Ansonsten generierst Du die Zufallszahl ohne alten Wert und speicherst sie ab.
 
Ja. Das sollte eigentlich passieren, wenn ich mehrmals drücke. Aber deinen unteren Teil habe ich nicht ganz verstanden.
Mein ActionEvent hat glaube ich keine Instanzvariable, sondern das ActionPerformed besitzt die Instanzvariable ActionEvent ae.
Tut mir leid, ich bin ein ziemlicher Anfänger, aber bin interessiert das zu lernen.
 
Ich schreib das mal in pseudocode.

public MainKlasse implements ActionListener extends JFrame
{

JButton generatorButton;
int alterWert=0;
Konstruktor()
{
generatorButton = new JButton("generate");
generator.setActionListener(this); // Hier fügen wir dem Button einen Actionlistener hinzu.
}

public void actionPerformed(ActionEvent e) {
if(e.getSource()==generatorButton)
{
//generiere neue zahl gib sie aus und speichere sie in "alterWert"
}
}
public static main()
{
MainKlasse mainklasse = new Mainklasse();
mainklasse.pack();
mainklasse.setVisible(true);
}
}

So in die richtung sollte es hinkommen.....
 
public void actionPerformed(ActionEvent ae) {
// TODO Auto-generated method stub
String ac = ae.getActionCommand();
if(ac.equals("berechne")) {
int a = 0;
int b = 18;
int m = 0;
int s = 0;
int i;
int pseudo;

try {
s = Integer.parseInt(x.getText());
m = Integer.parseInt(y.getText());
a = Integer.parseInt(z.getText());
}
catch (Exception e){
e.printStackTrace();
System.exit(1);
}

for(i = 1; i <= 1000;i++){
pseudo = (a*s+b) % m;

tfzahl.setText(Integer.toString(pseudo));
}

So sieht das bei mir momentan aus.
Ich verstehe deinen Text i-wie nicht.
Du stellst einen Button her, welcher dann einen actionListener bekommt und der bei Knopfdruck einen Event auslöst, welches dann eine neue Zahl generiert ?! ist das richtig ?
Denn ich verstehe nicht, inwiefern "alterWert" dann bei einem weiteren Knopfdruck eingesetzt wird.


Kann es sein, dass das 2-mal drücken bei mir nicht funktioniert, da 2-mal der gleich befehl kommt. also 2-mal "berechne". Das unterscheidet sich ja nicht. Ändert sich vllt deswegen die Zahl nicht ?
 
Zuletzt bearbeitet:
Bitte verwende die Code-Tags!

Dass Du die Zahl bereits in einem Textfeld speicherst, war bisher nicht bekannt!

Was jetzt noch fehlt, ist beim Aufruf der Methode zu prüfen, ob im Textfeld bereits etwas (sinnvolles) steht und dann eben diese Information für die Erstellung der neuen Zahl zu nutzen.

Ohne Textfeld würde man den Wert in einer Instanzvariablen speichern, damit man später darauf zugreifen kann. Was eine Instanzvariable ist und wie man darauf zugreift, kannst Du sicher selbst eruieren.
 
Achso. Entschuldigung :(
Und wie mach ich das jetzt, wenn ich den Wert für die neue Zahl benutzen will ?
Denn ich kann ja nicht mittendrin sozusagen den Quellcode ändern.
Ich hätte jetzt gedacht, dass ich einfach eine neues pseudo-feld entwickel, aber das würde ja nicht wissen, wann es losgehen soll.


Könnnte man das nicht gut in einer For-Schleife einrichten ?
 
Zuletzt bearbeitet:
Cybersider schrieb:
Mein ActionEvent hat glaube ich keine Instanzvariable, sondern das ActionPerformed besitzt die Instanzvariable ActionEvent ae.
Das ActionEvent hat Instanzvariablen, über auf die du über Methode zugreifen kannst, siehe: Doku. Für dein Problem taugen die aber nichts.

actionPerformed bekommt eine ActionEvent-Instanz als Parameter übergeben, das könnte man noch als lokale Variable durchgehen lassen, mit Instanzvariablen hat das aber nichts zu tun.

Gute Stil wäre natürlich, anstatt das Textfeld als Datenspeicher zu missbrauchen, ein neues "pseudo-feld" anzulegen, sprich: Du gibst deiner Klasse eine Instanzvariable vom Typ int. Diese liest du in deiner Methode als erstes aus und schreibst dort den neu berechneten Wert am Ende der Methode wieder hinein.

Edit: Ich sehe gerade, dass bluebarcode mehr Java- als Pseudocode geschrieben hat. Dort sind sogar zwei Instanzvariablen angelegt.
 
Zuletzt bearbeitet:
Also sozusagen das ich pseudo = result setzte, wobei result dann in das TextFeld kommt.
Aber wie mache ich das dann, wenn ich das nächste mal ein ActionEvent erzeuge, dann soll ja ein neuer Wert ausgegeben werden mit dem im "pseudo" gespeicherten Wert.
 
Bei dir ist pseudo eine lokale Variable. Entweder du machst daraus eine Instanzvariable oder du schreibst
Code:
int pseudo = this.myPseudo;

// rechnen ....

this.myPseudo = pseudo;
 
Ok. Es ist jetzt eine Instanzvariable.
Aber jetzt habe ich immernoch das Problem mit der Gleichung.
Momentan würde ich ja pseudo ausrechnen und sofort ausgeben.
Aber ich möchte ja bei wiederholtem klicken des Buttons, den alten wert nimmt und einen neuen erschafft. dass es ungefähr so aussieht:
pseudo1 = (a*pseudo+b) % m; und das mit jedem klick so weiter.
 
Zuletzt bearbeitet:
Wenn du pseudo nicht als final deklariert hast, funktioniert das hier:
Code:
pseudo = (a*pseudo+b) % m;
 
ok.. Sieht zwar von den Ergebnissen noch ein wenig fehlerhaft aus, aber das kann ich hoffentlich selber korrigieren :D
Vielen Dank dir und den anderen, die sich die Zeit und Mühe und auch die Geduld genommen haben, mir zu helfen :) Sehr freundlich und hilfsbereit. Sollte mehrere von eurer Sorte geben :)

Edit:
Ein Frage doch noch :D
Durch diese Gleichung ist es ja so, dass "s" jetzt vollkommen außer Acht gelassen wird, wie kann ich es programmieren, dass es erst mit "s" anstatt pseudo rechnet und dann beim 2. ActionEvent pseudo statt "s"?
 
Zuletzt bearbeitet:
War die Frage jetzt ernst gemeint? :freak:

Boolean-Variable verwenden, die du nach dem "s" auf true setzt und ein If vor der Rechnung platzieren, dass bei false "s" und bei true mit "pseudo" weiterrechnet.


Ich glaube, du bist noch gar nicht so weit, schon mit GUIs herum zu hantieren, wenn dir die grundlegenden Kontrollstrukturen noch nicht ins Blut übergegangen sind.
 
Zurück
Oben