Question

Après avoir gratté autour j'ai trouvé qu'il est préférable de mettre en œuvre un composant d'image personnalisée en étendant un JLabel. Jusqu'à présent, qui a beaucoup travaillé que je peux ajouter plusieurs « images » (JLabels sans la mise en page de rupture. J'ai juste une question que j'espère que quelqu'un peut répondre pour moi.

  • J'ai remarqué que pour animer JLabels à travers l'écran, je dois setlayout(null); et setbounds du composant et puis pour animer éventuellement setlocation(x,y);. Est-ce une bonne pratique ou d'une façon terrible pour animer un composant? Je prévois éventuellement faire une classe d'animation, mais je ne veux pas le faire et finissent par avoir à balancer.

J'ai inclus le code correspondant pour une vérification d'examen rapide.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GraphicsPanel extends JPanel  {
    private Timer timer;
    private long startTime = 0;
    private int numFrames = 0;
    private float fps = 0.0f;
    private int x = 0;

    GraphicsPanel() {
        final Entity ent1 = new Entity();
        ent1.setBounds(x, 0, ent1.getWidth(), ent1.getHeight());
        add(ent1);

        //ESSENTIAL
        setLayout(null);

        //GAMELOOP
        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                getFPS();
                incX();
                ent1.setLocation(x, 0);
                repaint();
            }
        });
        timer.start();
    }

    public void incX() { x++; }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setClip(0, 0, getWidth(), getHeight());

        g2.setColor(Color.BLACK);
        g2.drawString("FPS: " + fps, 1, 15);
    }

    public void getFPS()
    {
        ++numFrames;
        if (startTime == 0) {
            startTime = System.currentTimeMillis();
        } else {
            long currentTime = System.currentTimeMillis();
            long delta = (currentTime - startTime);
            if (delta > 1000) {
                fps = (numFrames * 1000) / delta;
                numFrames = 0;
                startTime = currentTime;              
            }
        }
    }
}

Merci!

Était-ce utile?

La solution

  

J'ai remarqué que pour animer   JLabels à travers l'écran que je dois   setLayout (null); et setbounds du   composant, puis à animer   éventuellement setLocation (x, y) ;. Est-ce   une meilleure pratique ou d'une manière terrible   animer un composant?

Eh bien, ce n'est pas tout à fait vrai. Vous pouvez tout simplement jouer avec l'emplacement et l'étiquette se déplacera autour de l'écran. Cependant, si vous redimensionnez jamais le cadre ou quoi que ce soit le gestionnaire de mise en page sera appelée et l'étiquette sera repositionné et l'emplacement défini par le gestionnaire de mise en page qui, dans le cas d'un FlowLayout sera le haut / gauche du panneau. L'animation se poursuivra à partir de cet endroit. Donc, en réalité, oui, c'est exactement ce que vous devez faire.

Je trouve la meilleure façon de faire de l'animation depuis Swing repeindre automatiquement le « dernier » emplacement du composant (pour restaurer l'arrière-plan), ainsi que la peinture du nouvel emplacement du composant. Tout cela est réalisé par une méthode unique setLocation ().

Certaines personnes aiment faire de la peinture personnalisée en dessinant l'image directement sur le panneau, mais vous êtes responsable de la compensation l'ancien emplacement de l'image pour l'arrière-plan est redessinée puis dessiner l'image dans le nouvel emplacement. Je trouve cela trop de travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top