Animationen

Kurze Frage:
Ich möchte die Position und Grösse eines JFrames fliessend (!) ändern. Mit 2 Schleifen hab ich das bereits erledigt, ein sepereat gestarteter Thread auf "Thread.MINPRIORITY" erledigt das wunderbar, allerdings unter einer recht hohen CPU-Last.

Ich habe bereits CPU-schonende Animationen mittels Java gesehen, wie müsste ich meinen Code umbauen? Eventuell irgendwelche Buffer?
Google schwieg dazu bisher ... sorry.
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.DisplayMode;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;

/**
 * @author Thomas.Darimont
 * 
 */
public class MovingFrameExample extends JFrame {

    public MovingFrameExample() {
        super("MovingFrameExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(120, 90);
        setVisible(true);

        Executors.newSingleThreadExecutor().execute(new Runnable() {
            public void run() {

                DisplayMode currentDisplayMode = GraphicsEnvironment
                        .getLocalGraphicsEnvironment().getScreenDevices()[0]
                        .getDisplayMode();

                int dx = 5;
                int dy = 5;
                double scaleFactor = 1.05;

                Point currentLocation = getLocation();
                double currentScaleFactor = scaleFactor;

                while (true) {

                    try {
                        TimeUnit.MILLISECONDS.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    if (getWidth() > 360) {
                        currentScaleFactor = 1 / scaleFactor;
                    }

                    if (getWidth() < 120) {
                        currentScaleFactor = scaleFactor;
                    }

                    setSize((int) (getWidth() * currentScaleFactor),
                            (int) (getHeight() * currentScaleFactor));

                    getLocation(currentLocation);

                    if (currentLocation.x < 0) {
                        dx *= -1;
                    }

                    if (currentLocation.x + getHeight() > currentDisplayMode
                            .getWidth()) {
                        dx *= -1;
                    }

                    if (currentLocation.y < 0) {
                        dy *= -1;
                    }

                    if (currentLocation.y + getHeight() > currentDisplayMode
                            .getHeight()) {
                        dy *= -1;
                    }

                    currentLocation.translate(dx, dy);

                    setLocation(currentLocation);
                }

            }
        });
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new MovingFrameExample();
    }

}
Warum willst du sowas machen?

Für flüssige Animationen INNERHALB eines JFrames verwendet man am besten eine BufferStrategy ... siehe:
http://www.tutorials.de/forum/1320560-post10.html

Gruß Tom
 
Warum willst du sowas machen?
Damit der Kunde in seinem CMS kein Augenkrebs kricht :rolleyes: UND er auch n bisken beeindruckter is, wenn er es zum ersten mal sieht ^^
Für flüssige Animationen INNERHALB eines JFrames verwendet man am besten eine BufferStrategy ... siehe:
http://www.tutorials.de/forum/1320560-post10.html
Gruß Tom
interessant, schonmal danke.


Hmm... Diese Thread-Pools scheinen auf niedriger Priorität zu laufen, denn wenn man deinen Timer auskommentiert läuft es auf fast derselben Geschwindigkeit wie vorher (zumindest auf meiner schwachen 2,5 Ghz-Kiste), leider zu langsam für mich.

Im großen und ganzen hast du dasselbe gemacht wie ich, ausser der Sache mit dem Pool ...., und bei den von mir geforderten Bewegungsgeschwindigkeiten erzeugt das leider 100% CPU-Last.
Um es mal zu spezifizieren: derzeit will ich ein Fenster mit meiner eigenen Methode maximieren, der bereits vorhandene maximieren-Knopp wird von mir ersetzt werden bzw. bekommt eine andere Action (sofern möglich)

Ich dachte Java hat so ressourcenschonende und manchmal auch schöne Widgets, wo sind die alle geblieben? Ich muss was übersehen haben, sag mir bitte einer was denn genau
 
Zuletzt bearbeitet:
Zurück