Speichern in der paintComponent() Methode

Status
Nicht offen für weitere Antworten.

Xtian

Mitglied
Also ich bin eigentlich bezüglich Swing und weiterer grafikprogrammierung totaler anfänger und habe ein problem. Ich würde gere ein feld genereiren dass sich aus viele einzelnen gleichen bildern zusammensetzt. Dieses so entstandene Raster muss ich relativ oft ausgeben also sind immer repaints fällig die jede menge resourcen ziehen. Deshalb habe ich mir gedacht ich speichere einfach das Graphics Objekt ab damit ich nicht immer extra alles neu generieren muss. das hört sich zunächst verwirrend an aber vielleicht wird das klarer wenn man den code sieht.
Code:
class Spielfeld extends JPanel
{
  private BufferedImage[][] img;
  private boolean           veraendert = true;
  private Graphics          pSave      = null;
  
  public Spielfeld(int x, int y)
  {
    this.setDoubleBuffered(true);
    img = new BufferedImage[x][y];
    long tim = System.nanoTime();
    for (int i = 0; i < x; i++)
    {
      for (int j = 0; j < y; j++)
      {
        img[i][j] = new BufferedImage(28, 13, BufferedImage.TYPE_INT_ARGB);
      }
    }
    System.out.println("Initialisierung: " + (System.nanoTime() - tim));
  }
  
  @Override
  protected void paintComponent(Graphics g)
  {
    if (veraendert)
    {
      long tim2 = System.nanoTime();
      for (int i = 0; i < 50; i++)
      {
        for (int j = 0; j < 40; j++)
        {
          g.drawImage(img[i][j], 28 * j + (i % 2) * 14, i * 7, null);
        }
      }
      veraendert = false;
      pSave=g.create();
      System.out.println("Generierung:     " + (System.nanoTime() - tim2));
    } else
    {
      g=pSave.create();
    }
  }
  
  public void setzeFeld(int x, int y, BufferedImage bI)
  {
    img[x][y] = bI;
  }
  
  public BufferedImage getImg(int x, int y)
  {
    return img[x][y];
  }
}

ich hoffe dass jemand mein problem versteht und mir helfen kann
 

André Uhres

Top Contributor
Mal alles auf ein Image, dann brauchst du in paintComponent immer nur das fertige Image zu malen. Etwa so:
Code:
   private Image image;
    private Graphics2D g2d;//das sind die Graphics wo du alles drauf zeichnen kannst
    protected void generierung() {
        long tim2 = System.nanoTime();
        for (int i = 0; i < 50; i++) {
            for (int j = 0; j < 40; j++) {
                g2d.drawImage(img[i][j], 28 * j + (i % 2) * 14, i * 7, null);
            }
        }
        System.out.println("Generierung:     " + (System.nanoTime() - tim2));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            image = createImage(getWidth(), getHeight());
            g2d = (Graphics2D) image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setColor(Color.black);
            generierung();
        }
        Rectangle r = g.getClipBounds();
        g.drawImage(image, r.x, r.y, r.width + r.x, r.height + r.y,
                r.x, r.y, r.width + r.x, r.height + r.y, null);

    }
 

Maeher

Bekanntes Mitglied
Das Speichern des Graphics-Objektes bewirkt nicht das was du vermutlich erwartest, es enthält nämlich selbst nicht die Zeichnung sondern nur diverse Einstellungen zum Zeichnen.
 

Xtian

Mitglied
dankeschön für den code. klappt super ;) ich werd das alles jetzt noch mal nachvollziehen das heißt ein bisschen API studieren aber trotzdem nochmal danke :)
 

Xtian

Mitglied
achja aber ich hätte da noch eine frage. Wenn ich noch einige bilder mit alpha kanal einbaue das heißt teils transparent sollten die elemente die unter dem feld sind noch zu sehen sein.

gibt es da ne möglichkeit das prog so zu ändern dass doert nicht immer dieses weiße quadrat dahinter sitzt?
 

Tobias

Top Contributor
Dein Zwischenspeicher muß Transparenz unterstützen und deine Komponent (auf die du zeichnest) muß transparente Stellen erlauben, was man mit setOpaque(false) erreicht.

mpG
Tobias
 

Xtian

Mitglied
und wo genau muss ich das setOpaque(false) da einsetzen (sorry bin noch nicht so sonderlich in dem thema drin) ist jetzt halt so dass ich immer auf ein weißes quadrat die grafiken zeichne und dieses quadrat sollte durchsichtig sein
 

Xtian

Mitglied
kann mir das keiner genauer erklärn? also es liegt irgendwie an der zeile mit createImage() image zu tun wenn ich nämlich ein neues BufferedImage anlege statt das mit createImage zu machen dann ist der hintergrund transparent (natürlich nur wenn man zusätzlich das fillRect() weglässt) allerdings lässt das die performance um einiges schlechter werden keine ahnung wieso... von 22% CPU auslastung auf 46% bei ungefähr 18 bildern pro sekunde und wär halt schon hilfreich wenn es da irgend eine andere lösung gäbe als mit dem neuen BufferedImage. Vielleicht auch eine möglichkeit das erzeugte Image komplett transparent zu machen oder so.

das mit dem setOpaque(false); hab ich noch nicht richtig verstanden... egal wo ich es reinsetzte das weiße Quadrat bleibt hintendran.

ich hoffe dass mir jemand helfen kann
 

Xtian

Mitglied
okay ich muss mich korrigieren mit nem neuen buffered image is das teil nicht unsichtbar sondern hat nur die farbe des hintergrundes...
also brauch ich ne komplett neue lösung ;)
 

Quaxli

Top Contributor
Wenn Du ein Bild einliest, das schon transparent ist, z. B. ein GIF und das als BufferedImage lädst (idealerweise mit ImageIO), dann gibt es eigentlich kein Problem.
 

Xtian

Mitglied
nee ich denke mal bei der funktion create image wird dann falls das panel auf das gezeichnet wird nichts enthält ein weißes bild erzeugt zumindest sieht das so bis jetzt aus und danach schreibe ich ja erst das geladene bild drüber bei dem dann der weiße hintergrund durch doe transparenten bereiche durchscheint
 

Xtian

Mitglied
hmm scheint wohl nimand zu wissen ich hab bis jetzt lieder auch nichts gefunden das geht... wäre aber für einen rat sehr dankbar
 

André Uhres

Top Contributor
Dein Zwischenspeicher muß Transparenz unterstützen, wie Tobias bereits erwähnte.
Aber setOpaque(false) macht imho keinen Sinn, denn das Ganze muss ja schliesslich irgendeinen einen Hintergrund haben. Zudem würde setOpaque(false) die GUI unnötig verlangsamen.
 

André Uhres

Top Contributor
Xtian hat gesagt.:
und wie schaff ich das dass der zwischenspeicher dies transparenten bereiche erlaubt?
Beispiel:
Code:
       if (image == null) {
            image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            g2d = (Graphics2D) image.getGraphics();
            generierung();
        }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
officialmaxl JavaFX Textfield getTextfield() in String speichern AWT, Swing, JavaFX & SWT 1
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
J Warum kann ich die Spaltennummer in der Konsole anzeigen, diese aber nicht speichern ? AWT, Swing, JavaFX & SWT 6
F Output Stream / File Dateien / Speichern AWT, Swing, JavaFX & SWT 13
D String als Textdatei in ausgewähltem Speicherplatz speichern AWT, Swing, JavaFX & SWT 32
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
S URLS speichern von Internetseiten AWT, Swing, JavaFX & SWT 3
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
P Adressbuch Werte speichern AWT, Swing, JavaFX & SWT 21
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
G JTextField Eingabe in DB speichern AWT, Swing, JavaFX & SWT 68
B TableView als PDF speichern AWT, Swing, JavaFX & SWT 8
cool_brivk24 libGDX Welt speichern AWT, Swing, JavaFX & SWT 0
R Scene speichern AWT, Swing, JavaFX & SWT 7
D Inhalt von JTextField in MySQL speichern. Wie ? AWT, Swing, JavaFX & SWT 1
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
GenerationLost JavaFX FileChooser speichern ohne Zieldatei? AWT, Swing, JavaFX & SWT 12
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
M Kamerabilder in ein Ordner speichern AWT, Swing, JavaFX & SWT 12
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
I JavaFX Speichern der eingefügten Einträge beim Neustart des Programms AWT, Swing, JavaFX & SWT 2
I Variabeln speichern in Desktop Anwendung AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
S JavaFX Fenstergrösse automatisch Speichern und Laden AWT, Swing, JavaFX & SWT 4
J Swing Fenstereinstellungen speichern AWT, Swing, JavaFX & SWT 2
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
J Swing JTable speichern AWT, Swing, JavaFX & SWT 2
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
S Panelzeichnung speichern AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
A JFileChooser Datei speichern AWT, Swing, JavaFX & SWT 4
B Bildverlust bei Speichern in .jar-Archiv AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2
J JFileChooser - Datei speichern AWT, Swing, JavaFX & SWT 7
J JTree speichern AWT, Swing, JavaFX & SWT 4
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
T Modell als XML Speichern / Laden AWT, Swing, JavaFX & SWT 9
P TextField beim klicken von JButton speichern AWT, Swing, JavaFX & SWT 17
P Öffnen, Speichern von Dat. über DialogBoxen AWT, Swing, JavaFX & SWT 10
B Zustand eines GUI speichern AWT, Swing, JavaFX & SWT 8
I Dialog zum Speichern? AWT, Swing, JavaFX & SWT 16
M JTable Drucken NullpointerException +JTable speichern AWT, Swing, JavaFX & SWT 6
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T SWT:Datei speichern / öffnen AWT, Swing, JavaFX & SWT 6
T speichern funktioniert,aber öffnen nicht AWT, Swing, JavaFX & SWT 2
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
M Position eines JLabels speichern? AWT, Swing, JavaFX & SWT 3
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
S JTable - Sortierung beibhalten / Speichern. AWT, Swing, JavaFX & SWT 3
C Checkbox-zustände in einem JFrame speichern AWT, Swing, JavaFX & SWT 8
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6
B Panel als Bild speichern AWT, Swing, JavaFX & SWT 11
Daniel_L Grafik erstellen, drin zeichnen und dann speichern AWT, Swing, JavaFX & SWT 2
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
E Profilsichten speichern und dynamsich erzeugen?! AWT, Swing, JavaFX & SWT 2
N JTable direkt editierenund in Datenbanken speichern AWT, Swing, JavaFX & SWT 5
D Swing JTable in Datei speichern und laden AWT, Swing, JavaFX & SWT 3
R JComboBox Ausgabe in String speichern AWT, Swing, JavaFX & SWT 3
F Wert zu Eintrag in ComboBox speichern?! AWT, Swing, JavaFX & SWT 7
0 Ausschnitt eines JPanels als Bild speichern AWT, Swing, JavaFX & SWT 4
A Programmieren einer Agenda mit einer Liste (als Applet und .txt zum Speichern) AWT, Swing, JavaFX & SWT 7
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
B textdatei speichern AWT, Swing, JavaFX & SWT 9
K Swing JFileChooser zum Speichern - FileFilter AWT, Swing, JavaFX & SWT 2
jgh Speichern von User-GUI-Einstellungen AWT, Swing, JavaFX & SWT 2
B Swing Suche JFileChooser zum Speichern AWT, Swing, JavaFX & SWT 2
N gezeichnete Graphiken speichern und wieder anzeigen AWT, Swing, JavaFX & SWT 8
M AWT Datei auf server speichern und beschreiben AWT, Swing, JavaFX & SWT 7
G Swing Image speichern / 0 Byte AWT, Swing, JavaFX & SWT 7
U Wo eingeloggten Benutzer "speichern" AWT, Swing, JavaFX & SWT 10
J Aus einer JList den Inhalt als Textdatei speichern AWT, Swing, JavaFX & SWT 15
C Bild in einer Datenbank speichern? AWT, Swing, JavaFX & SWT 7
Z JTable: Speichern probleme AWT, Swing, JavaFX & SWT 12
L JPanel als Image speichern AWT, Swing, JavaFX & SWT 3
D SWT String aus Textfeld auslesen und in eine Tabelle speichern AWT, Swing, JavaFX & SWT 5
J Werte aus Combobox speichern AWT, Swing, JavaFX & SWT 3
B JEditorPane - Text und Graphik in HTML speichern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben