Java: Ständiges Repaint beim Drücken eines Button

Von: , Frage gestellt am So, 8. Feb 2009

Hallo,
ich entschuldige mich erstmal für den Titel der ist ein bisschen unklar. Also ich möchte ein Java Applet schreiben, welches mithilfe der Monte Carlo Simulation Pi berechnet. Soweit so gut, ist für die Frage völlig irrelevant.

Mein Problem ist jetzt, dass ich ein Button implementieren möchte und bei Knopfdruck auf den Button sollen 500 verschiedene Punkte eingezeichnet werden. Diese Punkte sollen auch erhalten bleiben. Wie realisiere ich das jetzt, dass ich nicht jedesmal alle Punkte neuzeichnen (repaint()) muss?

Vielen Dank
david

3 Antworten zu dieser Frage

  1. Antwort von nach einem Tag 0 hilfreich
    Re: Java: Ständiges Repaint beim Drücken eines But

    Hallo,

    versteh ich das richtig, dass Du die Punkte erhalten willst und bei erneutem Druck auf den Button neue Punkte zeichnen willst?
    Du hast also eine Methode, mit der Punkte generiert werden?
    Dann solltest Du Dir die Punkte in irgendeiner Form merken und beim nächsten aufruf Deiner Methode zum Erzeugen der Punkte, überprüfst Du, ob es den entsprechenden Punkt gibt.

    Das ist jetzt alles sehr abstrakt, aber wenn Du es genauer brauchst, musst Du ein Code-Beispiel liefern.


    Gruß, Stephan

  2. Antwort von nach einem Tag 0 hilfreich
    Re: Java: Ständiges Repaint beim Drücken eines But

    Hier das ist mein Quelltext. Ich hoffe man sieht einigermaßen durch. Wenn nicht beantworte ich gerne alle Fragen dazu.

    import java.awt.*;
    import java.applet.Applet;
    import java.awt.event.*;
    public class Pi extends Applet implements ActionListener{
    int innerhalb; // Variabel, die zählt wieviele Treffer innerhalb des Kreises sind
    int auserhalb; // Treffer außerhalb
    int hilf=1; // Anzahl der Würfe | dient als Index in den Speicherarrays x[] y[]
    int dimension = 100000; // Anzahl der möglichen Punkte
    int x[] = new int[dimension]; int y[] = new int[dimension];
    public Button s1,s2,s3;
    public void paint(Graphics g){
    //
    g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); // zeichnet ein Rahmen um das Applet
    g.drawOval(0, 0, 400, 400); // Der Kreis
    g.drawRect(0, 0, 400, 400); // großes Quadrat
    innerhalb = 0; // lokale Variabeln, zählen ob Treffer innerhalb oder außerhalb des Kreises sind
    auserhalb = 0;
    for (int i=1;i<hilf;i++){ // durchläuft alle Punkte
    if (Math.sqrt((x[i]-200)*(x[i]-200)+(y[i]-200)*(y[i]-200))<200){ // prüft ob Treffer innerhalb sind
    g.setColor(Color.red);  // innen rot
    g.fillOval(x[i], y[i], 3, 3); 
    innerhalb++;}
    else{ // sonst Treffer außerhalb
    g.setColor(Color.blue); // außen blau
    g.fillOval(x[i], y[i], 3,3 );
    auserhalb++;
    }
    // Ausgabe:
    }
    g.setColor(Color.black);
    g.drawString("Punkte innerhalb des Kreises: "+innerhalb, 430, 270);
    g.drawString("Punkte ausserhalb des Kreises: "+auserhalb, 430, 290);
    int anzahl = auserhalb + innerhalb;
    g.drawString("Anzahl der Würfe: "+anzahl,430,310);
    double pi = (double) 4*innerhalb / anzahl;
    g.drawString("Daraus ergibt sich: Pi = "+pi, 430, 330);
    }
    public void init(){
    this.setSize(700,400);
    s1 = new Button("10000 Würfe");
    s2 = new Button("100 Würfe");
    s3 = new Button("1 Wurf");
    setLayout(null);
    s1.setBounds(430,50,100,50);
    s2.setBounds(430,120,100,50);
    s3.setBounds(430,190,100,50);
    add(s1);
    add(s2);
    add(s3);
    s1.addActionListener(this);
    s2.addActionListener(this);
    s3.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e){ // steuert, welcher Button angeklickt wurde
    if (e.getSource() == s1){
    zeichne(10000);
    }
    if (e.getSource() == s2){
    zeichne(100);
    }
    if (e.getSource() == s3){
    zeichne(1);
    }
    }
    void zeichne(int anzahl){ // füllt den Speicherarray um anzahl plätze mit koordinaten, bisherige Koordinaten bleiben gespeichert. 
    try{
    for (int i=hilf;i<=hilf+anzahl;i++){
    x[i] = (int) (400*Math.random());
    y[i] = (int) (400*Math.random());
    }
    hilf = hilf+anzahl;
    repaint(); 
    }
    catch(Exception e){ // Wenn zu viele Punkte gesetzt werden
    }
    }
    }
    

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: Java: Ständiges Repaint beim Drücken eines B

      Du meinst, dass das ganze neu gezeichnet wird, wenn man das Fenster verändert? Ansonsten versteh ich auch Deine Frage nicht. Wäre höchstens noch anzumerken, dass Du statt getrennter x/y Paare vielleicht gleich Point speichern solltest. Ansonsten ist doch erstmal alles gut. :)

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!