1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Animation in Swing

  • hucskfjs
  • 16. Mai 2013 um 18:40
  • Unerledigt
  • hucskfjs
    8
    hucskfjs
    Mitglied
    Punkte
    575
    Beiträge
    80
    • 16. Mai 2013 um 18:40
    • #1

    hallo!

    ich habe folgendes problem und hoffe, dass mir jemand weiterhelfen kann:

    ich habe erfolgreich einen layout manager geschrieben, welcher die zielpositionen aller komponenten im container bestimmt und anschließend die methode move(component,x,y) aufruft, welche die komponenten als effekt flüssig an die jeweilige zielposition schieben sollte.

    Code
    private static void move(final java.awt.Component comp, final int destX, final int destY)
    {
            // if this is the components first setting, set bounds directly
            if(comp.getBounds().x == 0 && comp.getBounds().y == 0)
                comp.setBounds(destX, destY, comp.getPreferredSize().width, comp.getPreferredSize().height);
    
            // else move component to their destination
            else
                new Thread()
                {
                    public void run()
                    {
                        for(int x = comp.getBounds().x; (comp.getBounds().x > destX && x > destX) || (comp.getBounds().x < destX && x < destX);)
                        for(int y = comp.getBounds().y; (comp.getBounds().y > destY && y > destY) || (comp.getBounds().y < destY && y < destY);)
                        {
                            comp.setBounds(x, y, comp.getPreferredSize().width, comp.getPreferredSize().height);
    
                            if(comp.getBounds().x > destX) x -= 5;
                            else x += 5;
    
                            if(comp.getBounds().y > destY) y =- 5;
                            else y += 5;
    
                            try { Thread.sleep(5); }
                            catch(InterruptedException err) {}
                        }
    
                        // set final destination bounds
                        comp.setBounds(destX, destY, comp.getPreferredSize().width, comp.getPreferredSize().height);
                    }
                }.start();
    }
    Alles anzeigen

    ich habe die kleine anwendung mit lediglich drei komponenten im container getestet und das resultat war völlig unzufriedenstellend. die components bewegen sich nicht flüssig und teilweise auch nicht an die richtige endposition. hat vielleicht jemand eine idee, wie ich geschickter vorgehen kann, um zum gewünschten ergebnis zu gelangen?

    danke im voraus.
    mfg

  • 2#4u
    5
    2#4u
    Mitglied
    Reaktionen
    8
    Punkte
    248
    Beiträge
    46
    • 16. Mai 2013 um 21:56
    • #2

    Ein paar Vorschläge und Fragen:

    - Du brauchst keine 2 for Schleifen, es reicht eine! Mit einer gemeinsamen Abfrage ob x und y auf Endposition sind.

    Bezüglich:

    PHP
    if(comp.getBounds().x > destX) x -= 5;
    else x += 5;

    Bedeutet, dass du x erhöhst, wenn <= destX.
    Also auch, wenn x == destX - Vermutlich nicht unbedingt das was du willst.

    - Warum benutzt du x und comp.getBounds().x simultan? Haben die unterschiedliche Werte?

    Übrigens benutzt du nicht Swing sondern AWT. Denn in Swing wäre diese Thread-Sauerei nicht möglich.
    Siehe auch:
    http://openbook.galileodesign.de/javainsel5/javainsel15_032.htm

    Stefan Spelitz
    [Computergraphik UE Tutor 2017SS]

  • hucskfjs
    8
    hucskfjs
    Mitglied
    Punkte
    575
    Beiträge
    80
    • 17. Mai 2013 um 17:14
    • #3

    danke, so funktioniert es einigermaßen.

    Code
    //loop every step to destinationfor(int x = comp.getBounds().x, y = comp.getBounds().y;
       (comp.getBounds().x > destX && x > destX) || (comp.getBounds().x < destX && x < destX) ||
       (comp.getBounds().y > destY && y > destY) || (comp.getBounds().y < destY && y < destY) ;)
    {
    
    	// set step bounds
    	comp.setBounds(x, y, comp.getPreferredSize().width, comp.getPreferredSize().height);
    	comp.repaint();
    
    	// in- or decrease x and y
    	if(comp.getBounds().x > destX) x--; else x += 1;
    	if(comp.getBounds().y > destY) y--; else y += 1;
    
    	// let thread sleep a second
    	try { Thread.sleep(1);  }
    	catch(InterruptedException err) {}
    }
    Alles anzeigen


    allerdings werde ich noch einbauen, dass der thread bei vorzeitiger umpositionierung gestoppt wird, so dass die components nicht "herumzittern".

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Tags

  • java
  • animation
  • thread
  • layout manager
  • nulllayout

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung