Wie kann ich etwas auf einem JPanel zeichnen, die nicht neu gestrichen werden?

StackOverflow https://stackoverflow.com/questions/275778

  •  07-07-2019
  •  | 
  •  

Frage

Wie kann ich etwas in JPanel ziehen, die gleich bleiben wird und nicht neu gestrichen werden, ich ein Verkehrssimulationsprogramm mache, und ich möchte, dass die Straße einmal gezogen werden, da es wird sich nicht ändern. Dank

War es hilfreich?

Lösung

Ich bin mir nicht sicher, dass Sie tatsächlich Ihre Straße nie neu gestrichen werden - neu streichen Feuerereignisse (zum Beispiel), wenn das Fenster verkleinert wird, oder wenn es ein anderes Fenster folgenden behindert sie sichtbar wird. Wenn Ihr Panel nie neu zeichnet, dann wird es eigenartig aussehen.

Soweit ich mich erinnere, Schaukel nur entsprechende Farbe Ereignisse für diese Umstände ausgelöst wird, so dass Sie mit einer geeigneten Überschreibung nach dem üblichen Verfahren von Subklassifizieren JPanel in Ordnung sein sollten:

public class RoadPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // your drawing code here
    }
}

Wenn Sie Ihren Weg in ein Bild oder ein anderes Grafikformat-Cache (speichern die Anzeigedaten mehrere Male Berechnung) einmal einmal gezogen, das Sie bei zukünftigen Farben etwas Zeit sparen könnten.

Andere Tipps

Meines Wissens nicht, es sei denn, es gibt einen Trick mit transparenten Overlays.

Die meisten grafischen Anwendungen, die ich sah (und hat) nur die ganze Platte auf jedem Neuzeichnen wieder ziehen. Jetzt können Sie das einmal tun, in einem Grafikpuffer und dann malen Sie einfach den ganzen Hintergrund auf einmal, schnell, durch die Grafik-Puffer Kopieren auf die JPanel. Es sollte schneller sein als alle grafischen Primitiven Aufruf der Straße zu ziehen.

Oder die Art und Weise einig 2D-Spiele zu tun, vielleicht ist es einmal malen und die beweglichen Teile aktualisieren, wie Sprites: es muss den alten Platz von dem Sprites verwendet löschen (Wiederherstellung des Hintergrunds dort) und wieder zieht die Sprites auf dem neuer Ort. So haben Sie immer noch eine Kopie der Straße in einem Grafikpuffer aber statt Nachziehen es jedes Mal ganz, nur ein paar kleine Teile aktualisieren. Kann etwas schneller sein.

Die Komponente muss jedes Mal neu gestrichen werden, dass die Platte (dh Rahmen minimierte / ein anderes Fenster auf der Oberseite setzen) verdeckt wird. Deshalb etwas Zeichnung nur einmal nicht funktionieren, wie Sie es möchten. Um Teile, die sich nicht ändern gezogen werden effizienter können Sie sie einmal auf einen ‚Puffer‘ Bild zeichnen, und dann nur diese Puffer zeichnen jedes Mal, dass die Platte oder die Komponente neu gezeichnet werden muss.

// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){

  if (roadImage == null) {
      // Create the road image if it doesn't exist
      roadImage = createImage(width, height);
      // draw the roads to the image
      Graphics roadG = roadImage.getGraphics();
      // Use roadG like you would any other graphics
      // object to draw the roads to an image
  } else {
      // If the buffer image exists, you just need to draw it.
      // Draw the road buffer image
      g.drawImage(roadImage, 0, 0, null);
  }
  // Draw everything else ...
  // g.draw...
}

Was ich gesetzt tun einen Booleschen Wert zu, ob ein bestimmter Teil neu gezeichnet werden muss. Dann wird in der paintComponent() Methode kann ich den Wert überprüfen und die bestimmte Sache neu zu zeichnen, oder nicht.

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if (drawRoad) {
        drawRoadMethod(g);
    }
    drawTheRest(g);
}

Ein bisschen wie das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top