Vielen Dank schon mal im Vorraus,
Philipp Lutz
> Hallo,
> ich habe ein JPanel, in das ich über die paint()-Methode etwas gezeichnet
> habe. Das Programm weiß nicht, was in das JPanel gezeichnet wurde. Gibt es
> eine Möglichkeit, daß ich den gesamten Inhalt des JPanels um eine Anzahl
> Pixel in eine bestimmte Richtung verschiebe?
In die paint-Methode zu malen ist bei Swing nicht gut. Besser ist es, das
in der paintComponent-Methode zu tun. Diese ist nämlich genau dafür
gedacht.
Ansonsten:
int x=10; //Versatz in x-Richtung
int y=20; //Versatz in y-Richtung
Graphics2D g2d=(Graphics2D)g;
AffineTransformation oldAT=g2d.getTransform();
g.setTransform(AffineTransformation.getTranslateInstance(x,y));
malWas();
g2d.setTransform(oldAT);
Sascha Broich
--
Wer den Teufel an die Wand malt,
spart Tapete.
> Ansonsten:
>
> int x=10; //Versatz in x-Richtung
> int y=20; //Versatz in y-Richtung
> Graphics2D g2d=(Graphics2D)g;
> AffineTransformation oldAT=g2d.getTransform();
> g.setTransform(AffineTransformation.getTranslateInstance(x,y));
>
> malWas();
>
> g2d.setTransform(oldAT);
Nicht gut. setTransform hat nebeneffekte, die ich letztens zu spüren
bekam (tooltip flashte auf, transform teilweise rückgängig gemacht,
tooltip verschwand, alles wieder in ordnung). besser die Methode
"transform(AffineTransformation)" benutzen (ohne set).
also:
int x=10; //Versatz in x-Richtung
int y=20; //Versatz in y-Richtung
Graphics2D g2d=(Graphics2D)g;
AffineTransformation oldAT=g2d.getTransform();
g2d.transform(AffineTransformation.getTranslateInstance(x,y));
malWas();
g2d.setTransform(oldAT);
Gruß,
-Wanja-
--
"Gewisse Schriftsteller sagen von ihren Werken immer: 'Mein Buch, mein
Kommentar, meine Geschichte'. [..] Es wäre besser, wenn sie sagten:
'unser Buch, unser Kommentar, unsere Geschichte'; wenn man bedenkt, dass
das Gute darin mehr von anderen ist als von ihnen." [Blaise Pascal]
> int x=10; //Versatz in x-Richtung
> int y=20; //Versatz in y-Richtung
> Graphics2D g2d=(Graphics2D)g;
> AffineTransformation oldAT=g2d.getTransform();
> g2d.transform(AffineTransformation.getTranslateInstance(x,y));
> malWas();
> g2d.setTransform(oldAT);
Das Problem mit dieser Methode ist, daß ich seltsamerweise ein Bild
nur einmal verschieben kann. Konkret will ich jedes mal, wenn das Bild
neu gezeichnet wird, den alten Inhalt verschieben, um auf die neue Fläche
etwas neues zu malen. Also habe ich den Code in die update()-Methode
geschrieben. Allerdings wird dabei das Bild immer nur beim ersten Aufruf
verschoben, danach aber nicht mehr.
Entschuldigung übrigens, daß ich meinen ersten Beitrag hier zweimal
reingestellt habe, aber ich hatte Probleme mit meinen Usenet-Client und
dachte erst, er hätte die Nachricht nicht abgeschickt.
setze das Panel in ein Scrollpane. Das ist dafür gedacht.
Gruß,
Andreas
>
> Vielen Dank schon mal im Vorraus,
>
Gerne geschehen.
Also ich glaube du hast da ein grundsätzliches Misverständnis.
die paintComponent-Methode wird immer aufgerufen, um den Inhalt des
JPanels zu malen, für gewöhnlich passiert das immer, wenn das System
meint etwas malen zu müssen. Die Methode beschreibt also praktisch den
Zustand zu jedem Zeitpunkt, nicht den Zustand zu einem bestimmten
Zeitpunkt. Mit anderen worten: nmehrmals aufrufen ändert nix, sofern du
nicht selbst dafür sorgst, dass sich etwas ändert.
Was willst du konkret?
Willst du konkret eine Animation erzeugen? z.B. eine, die ein Bild von
links nach rechts über den Bildschirm schiebt?
Das ginge z.B. so:
public class TimeBasedAnimationExample extends JPanel {
private final byte NO_TIME = -1;
private Timer repainter;
private long startTime;
public TimeBasedAnimationExample(){
setOpaque(false);
setPreferredSize(new Dimension(100,100));
}
public void start(){
stop();
startTime=NO_TIME;
repainter = new Timer();
repainter.scheduleAtFixedRate(new TimerTask(){
@Override
public final void run() {
repaint();
}
}, 0, 45); // repaint every 45ms
}
public void stop(){
if(repainter != null){
repainter.cancel();
}
}
//gets the position based on the elapsed time
public Point getPosition(){
if(startTime == NO_TIME){
startTime = System.currentTimeMillis();
}
final long elapsedTime = System.currentTimeMillis()-startTime;
final float speed = 0.1f;
final Rectangle bounds = getBounds();
final int x = ((int)(elapsedTime*speed))%bounds.width;
final int y = 20;
return new Point(x,y);
}
public void paintComponent(final Graphics g){
super.paintComponent(g);
final Graphics2D g2d = (Graphics2D)g;
final AffineTransform oldTransform=g2d.getTransform();
final Point position = getPosition();
g2d.transform(
AffineTransform.getTranslateInstance(position.x,position.y));
g.setColor(Color.RED);
g.fillOval(0, 0, 30,40);
g2d.setTransform(oldTransform);
}
public static void main(final String[] args){
final TimeBasedAnimationExample xample
= new TimeBasedAnimationExample();
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(xample);
frame.pack();
frame.setVisible(true);
xample.start();
}
}
Wie du siehst:
Ich stoße mit dem Timer alle 45 ms einen repaint an, das sorgt dafür,
dass paintComponent aufgerufen wird.
Ich berechnet bei jedem paintComponent-Aufruf über die getPosition()-
Methode die Position meiner Grafik, relativ zur verstrichene Zeit, seit
dem ersten paintComponent-Aufruf, mache daraus eine AffineTransformation
, die mir alles, was ich im folgenden male, als wäre es am Ursprung,
einfach verschiebt.
Ohne Beispielcode kann ich dir auch nicht mehr weiterhelfen, sorry, aber
so mächtig ist meine Glaskugel nun doch nicht.