Article View: pl.comp.lang.java
Article #153038Re: java 2D i znikajacy rysunek
From: sielim
Date: Sun, 23 Oct 2011 17:04
Date: Sun, 23 Oct 2011 17:04
113 lines
3903 bytes
3903 bytes
Uzytkownik "zoska" <klociaciocia@gmail.com> napisal w wiadomosci
news:3314ac17-cdaa-4834-8d4c-8fac287f6083@h5g2000vbf.googlegroups.com...
Generalnie takie rzeczy robi sie w ten sposób, ze wszystko rysujesz do
bufora (zobacz
takie cus jak np. ImageBuffer), a w metodzie paint nie rysujesz tla, tylko
kopiujesz na ekran
odpowiedni fragmencik (zadany Rectangle) ze swojego bufora roboczego.
Ponizej masz przyklad klasy pomocniczej, która to wykorzystuje.
Do Twoich celów mozesz w ogóle wywalic metode 'render' i atrybut
renderOK.
A poza tym, to nic nie rysujesz w paincie (tam postawiasz kopiowanie
z buffered imege'a), tylko jak cokolwiek chcesz wrzucic na ekran,
to piszesz do obiektu bi.getGraphics() ( tak, jak tu w paincie robi to
render() )
i ew. repaint() na panelu.
Powodzenia :)
package pl.org.sielim.swing;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
/**
* Panel wspomagajacy podwójne buforowanie.
* Jak tego uzywac ? - patrz metody render i setRenderOK
*
* @author filip
*/
public class BufferedPanel extends JPanel {
public BufferedPanel() {
}
/** Metoda tworzaca obraz. Do pokrywania - definiujemy wlasny
* sposób rysowania panelu.
* Domyslnie po prostu wypelnia panel kolorem tla.
* @param gdc
* @param d
*/
protected void render(Graphics gdc, Dimension d) {
gdc.setColor(this.getBackground());
gdc.fillRect(0, 0, d.width, d.height);
}
/** Z pomoca tej metody sygnalizujemy (false),
* ze zawartosc bufora jest nieaktualna
* i nalezy obraz wyrenderowac od nowa.
* Zawsze, kiedy uznalemy, ze trzeba renderowac od nowa,
* stosujemy sekwencje wywolan:
* setRender(false);
* repaint();
* @param v
*/
public void setRenderOK(boolean v) {
this.renderOK = v;
}
/** Przydaje sie - jak np. bawimy sie w klikanie mysza i pozycjonowanie,
skalowanie itp.
* @return
*/
public Dimension getImgSize() {
return this.bisize;
}
/****************************************/
private boolean renderOK;
public void paint(Graphics gdc) {
super.paint(gdc);
Dimension d = this.getSize();
//System.out.println("BIP paint " + d + "==" + this.getImgSize());
if (d != null) {
if ((bi == null) || !d.equals(this.getImgSize())) {
this.bisize = d;
System.out.println("create image !");
this.bi = this.createImage(d);
}
if (!this.renderOK) {
//System.out.println("render !");
this.render(bi.getGraphics(), d);
this.setRenderOK(true);
}
gdc.drawImage(bi, 0, 0, null);
}
}
private BufferedImage bi;
private BufferedImage getBufImage() {
return this.bi;
}
private void setBufImage(BufferedImage b) {
this.bi = b;
}
private Dimension bisize;
private BufferedImage createImage(Dimension d) {
BufferedImage bimg = (BufferedImage) createImage(d.width, d.height);
this.setRenderOK(false);
return bimg;
}
}
Technical Details
Message-ID:
<j81hf2$6qr$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!.POSTED!not-for-mailReferences:
<3314ac17-cdaa-4834-8d4c-8fac287f6083@h5g2000vbf.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!.POSTED!not-for-mail From: "sielim" <sielim.ciach@ciach.wp.pl> Newsgroups: pl.comp.lang.java Subject: Re: java 2D i znikajacy rysunek Date: Sun, 23 Oct 2011 19:04:37 +0200 Organization: http://onet.pl Lines: 114 Message-ID: <j81hf2$6qr$1@news.onet.pl> References: <3314ac17-cdaa-4834-8d4c-8fac287f6083@h5g2000vbf.googlegroups.com> NNTP-Posting-Host: host-81-190-110-104.gdynia.mm.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1319389474 7003 81.190.110.104 (23 Oct 2011 17:04:34 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Sun, 23 Oct 2011 17:04:34 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit