Double Buffering

Status
Nicht offen für weitere Antworten.

unknown_member

Bekanntes Mitglied
Hi!

Ich möchte ein Bild double buffern, das löse ich mit Swing. Aber wie geht das? Muss man da JBufferedImage schreiben? Das klappt bei mir nicht?
Muss man dazu ein extra Paket importieren?


thx, unknown_member
 

unknown_member

Bekanntes Mitglied
Mein Problem ist, wie kann ich "Swing verwenden"? Mit "JBufferedImage" kann's ja nicht klappen, oder? Antwortet mir doch bitte... :(

unknown_member
 

Marco13

Top Contributor
Zu Double Buffering mit Java findet sich sehr viel im Netz und sehr viel hier im Forum. Für AWT gibt es da ein Standard-Muster: "So gehts" - das schaut man sich an, und baut es bei sich ein. Bei Swing wird das DoubleBuffering automatisch gemacht. Also, wenn du NICHT Panels, Frames und Buttons sondern JPanels, JFrames und JButtons verwendest, dann "verwendest du schon Swing", und solltest dir um Double Buffering keine Gedanken machen müssen. (Und wenn du das doch machst oder machen mußt, hast du an anderer Stelle einen (vielleicht eher konzeptionellen) Fehler drin). Der Name BufferedImage hat übrigens NICHTS mit "Double Buffering" zu tun. (Das nur mal nebenbei - man kann ja nie wissen)
 

André Uhres

Top Contributor
Weiss nicht ob das hierhin passt, könnte aber sein:
Code:
package paint;
/*
* Eierfabrik.java
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.net.*;
import javax.swing.*;
public class Eierfabrik extends JFrame {
    private BildPanel bildPanel;
    private Image bildBuffer;
    private Graphics2D bildBufferGraphics;
    private Image bildImBild;
    private int x1, y1;//Position für bildImBild
    private JButton btAdd;
    private JButton btClear;
    private JToolBar toolBar;
    public Eierfabrik() {
        super("Eierfabrik benutzt einen Bildpuffer");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(450,460);
        setLocationRelativeTo(null);
        //ein Bild laden:
        System.out.println("Bild wird geladen...");
        URL url = null;
        try {
            url = new URL("http://www.blinde-kuh.de/ostern/mosaik-ei.gif");
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
        bildImBild = new ImageIcon(url).getImage().getScaledInstance(100, -1, Image.SCALE_SMOOTH);
        //JComponents erzeugen:
        toolBar = new JToolBar();
        btAdd = new JButton("Eier legen");
        btClear = new JButton("Wegräumen");
        bildPanel = new BildPanel();
        JLabel lb = new JLabel(new ImageIcon(bildImBild));
        //Layout:
        toolBar.add(btAdd);
        toolBar.add(btClear);
        getRootPane().setDefaultButton(btAdd);
        btClear.setEnabled(false);
        getContentPane().add(toolBar, BorderLayout.PAGE_START);
        getContentPane().add(bildPanel, BorderLayout.CENTER);
        getContentPane().add(lb, BorderLayout.LINE_END);
        //Listeners:
        btAdd.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btAddActionPerformed(evt);
            }
        });
        btClear.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btClearActionPerformed(evt);
            }
        });
        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                int w = getWidth();
                int h = getHeight();
                if(w < 340) w = 340;
                if(h < 390) h = 390;
                setSize(w, h);
            }
        });
    }
    private void btAddActionPerformed(final ActionEvent evt) {
        //bildImBild malen:
        bildBufferGraphics.drawImage(bildImBild, x1, y1, null);
        bildPanel.repaint();
        //Position (x1, y1) für nächstes bildImBild errechnen:
        int w = 120;
        int h = 130;
        x1 += w;
        if(x1 > w*2){
            y1 += h;
            x1 = 0;
            if(y1 > h*2){
                btAdd.setEnabled(false);//Bildpuffer ist jetzt voll Bilder
            }
        }
        btClear.setEnabled(true);//ermöglicht das Entfernen der Bilder aus dem Bildpuffer
    }
    private void btClearActionPerformed(final ActionEvent evt) {
        System.out.println(this+"\n"+bildPanel);
        //alle Bilder wieder aus dem Bildpuffer entfernen:
        bildBufferGraphics.clearRect(0, 0, getWidth()*1, getHeight()*1);
        bildPanel.repaint();
        btAdd.setEnabled(true);//ermöglicht das Hinzufügen neuer Bilder im Bildpuffer
        x1 = 0;
        y1 = 0;
        btClear.setEnabled(false);
    }
    public String toString() {
        return "Eierfabrik  width: "+getWidth()+"  height: "+getHeight();
    }
    public static void main(final String args[]) {new Eierfabrik().setVisible(true);}
    class BildPanel extends JPanel{
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            if(bildBuffer == null){
                //Bildpuffer erzeugen:
                int w = getWidth();
                int h = getHeight();
                bildBuffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                bildBufferGraphics = (Graphics2D)bildBuffer.getGraphics();
                bildBufferGraphics.setBackground(Color.GREEN);
                bildBufferGraphics.clearRect(0, 0, w, h);
            }
            //Bildpuffer malen:
            g.drawImage(bildBuffer, 0, 0, getWidth(), getHeight(), null);
        }
       
        public String toString() {
            return "BildPanel  width: "+getWidth()+"  height: "+getHeight();
        }
    }
}
 

André Uhres

Top Contributor
unknown_member hat gesagt.:
Bei mir wird da die Klasse "paint" nicht gefunden, bei deinem Prog..
Die "package" Anweisung setzt die Klasse in das Paket das du willst, das muss nicht "paint" sein.
Du kannst die Anweisung auch ganz weglassen, wenn du kein Paket haben willst.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Applet Double Buffering AWT, Swing, JavaFX & SWT 2
T 2D-Grafik Double Buffering AWT, Swing, JavaFX & SWT 7
lumo SWT Double Buffering AWT, Swing, JavaFX & SWT 5
K Flackern trotz Double-Buffering AWT, Swing, JavaFX & SWT 10
hdi Wie implementiere ich Double Buffering AWT, Swing, JavaFX & SWT 12
G Frage zu Double Buffering AWT, Swing, JavaFX & SWT 4
J Double-Buffering zu langsam AWT, Swing, JavaFX & SWT 4
L Double-Buffering AWT, Swing, JavaFX & SWT 2
D double Buffering abschalten? AWT, Swing, JavaFX & SWT 4
L Double Buffering bei JTable AWT, Swing, JavaFX & SWT 4
CptK Point2D.Double Kurven - Beschriftung und richtiges Anklicken AWT, Swing, JavaFX & SWT 7
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
B AWT GUI nimmt nur 19 Ziffern an, obwohl Max Wert von Double größer ist AWT, Swing, JavaFX & SWT 7
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
S Polygon mit double-Koordinaten AWT, Swing, JavaFX & SWT 2
N Double Buffern von BILDERN AWT, Swing, JavaFX & SWT 6
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
O 2D-Grafik Rectangle mit double Werten zeichnen AWT, Swing, JavaFX & SWT 3
M Object[][] in double[][] casten AWT, Swing, JavaFX & SWT 6
A aus einem Textfeld in double parsen AWT, Swing, JavaFX & SWT 10
J JSlider mit Double Werten AWT, Swing, JavaFX & SWT 5
T JTextField nur Double werte eingeben AWT, Swing, JavaFX & SWT 2
A Explicit casting Point2D.Double AWT, Swing, JavaFX & SWT 3
A TableRowSorter für double Werte mit Formatierung AWT, Swing, JavaFX & SWT 3
iLoveTheInternet AWT Rectangle2D.Double intersecs AWT, Swing, JavaFX & SWT 6
R drawString mit double Koordinaten AWT, Swing, JavaFX & SWT 5
L JTextField Umwandeln in double-Werte AWT, Swing, JavaFX & SWT 5
K double / int einlesen? AWT, Swing, JavaFX & SWT 12
L double in JTable formatieren AWT, Swing, JavaFX & SWT 7
P Integer, Double, etc mit getTableCellRendererComponent AWT, Swing, JavaFX & SWT 6
P Double-Werte sortieren mit TableRowSorter AWT, Swing, JavaFX & SWT 2
B JFormattedTextField mit DecimalFormat in ein Double AWT, Swing, JavaFX & SWT 11
S double in String umwandeln AWT, Swing, JavaFX & SWT 6
R Double in der Tabelle statt String und Integer AWT, Swing, JavaFX & SWT 3
Student "Dicke" einer Linie - Line2D.Double AWT, Swing, JavaFX & SWT 12
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
G Ellipse2D.Double funktioniert nicht AWT, Swing, JavaFX & SWT 3
W SWT - Tree: Problem mit Double-Click expand AWT, Swing, JavaFX & SWT 5
K AWT flackern trotz buffering AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben