PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Flackerprobleme mit Offscreen (Java 1.0, Image und Graphics)



axeljaeger
11-07-2004, 10:26
Hallo,
ich habe eine Java-Komponente, die ein Offscreen Image benutzt. Der Benutzer kann den Inhalt der Komponente anfassen und umherschieben. Nach jedem mouseDragEvent wird repaint() aufgerufen. Dabei kopiere ich meinen Offscreen auf den Schirm. Leider kommt es durch den Offscreen zu schlimmerem Flackern als ohne. Ich gehe mittlerweile davon aus, dass Graphics.drawImage asyncron ist und die Komponente beim Zeichnen nicht warten muss, bis das vorige Bild gezeichnet wurde. Ich möchte möglichst keinen Thread verwenden, der alle 100ms einfach neuzeichnet, oder komme ich da nicht drumrum?
Vielen Dank für Aufklärung.


import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextField;
import java.awt.Button;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Plotter extends Applet implements ActionListener {
TextField field = new TextField("", 60);
Button button = new Button("Zeichne");
PlotCanvas c = new PlotCanvas();

public void init() {
add(field);
add(button);
add(c);
field.addActionListener(this);
button.addActionListener(this);
setBackground(Color.white);
}

public void actionPerformed(ActionEvent e) {
c.setFunction(field.getText());
}
}

class PlotCanvas extends Component implements MouseListener, MouseMotionListener {
String func;
Image offscreen;
int xt, yt;
int xc, yc;
public PlotCanvas() {
xt = 200;
yt = 150;
addMouseListener(this);
addMouseMotionListener(this);
}

public void setFunction(String s) {
func = s;
repaint();
}

public Dimension getPreferredSize() {
return new Dimension(500,300);
}

public Dimension getMinimumSize() {
return new Dimension(200,150);
}

public void mouseDragged(MouseEvent me) {
xt = (me.getX() - xc);
yt = (me.getY() - yc);
repaint();
}

public void mousePressed(MouseEvent me) {
xc = me.getX() - xt;
yc = me.getY() - yt;
mouseDragged(me);
}

public void update(Graphics g) {
Graphics og;
if (offscreen == null) {
offscreen = createImage(getWidth(), getHeight());
}
og = offscreen.getGraphics();
og.clearRect(0,0,getWidth(), getHeight());
og.setColor(new Color(200,200,200));
int xpos;
for (int i = 0; i < 30; i++) {
xpos = (xt % 20) + i*20;
og.drawLine(xpos, 0, xpos, getHeight());
}
int ypos;
for (int i = 0; i < 20; i++) {
ypos = (yt % 20) + i*20;
og.drawLine(0, ypos, getWidth(), ypos);
}
og.translate(xt, yt);
og.setColor(Color.black);
og.drawLine(-200, 0,200, 0);
og.drawLine(0, -150, 0, 150);
g.drawImage(offscreen, 0,0, this);

}

public void paint(Graphics g) {
update(g);
}

public void mouseMoved(MouseEvent me) {}
public void mouseClicked(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}

bischi
11-07-2004, 11:18
Kannst ja auf meiner HP mal das Swing-Tutorial (tutorials und bücher -> das erste Tut) anschauen. Dort hab ich ein Beispiel beschrieben für die Doppelbufferung (genau was du machen willst). Ich hab dein Beispiel kurz durchgesehen und bin der Meinung, dass alles einigermassen stimmen sollte.

MfG Bischi