Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel中的JLabel动画_Java_Swing_Animation_Jlabel_Java 2d - Fatal编程技术网

Java JPanel中的JLabel动画

Java JPanel中的JLabel动画,java,swing,animation,jlabel,java-2d,Java,Swing,Animation,Jlabel,Java 2d,经过反复研究,我发现最好通过扩展JLabel来实现自定义映像组件。到目前为止,这非常有效,因为我可以添加多个“图像”(jlabel),而不会破坏布局。我只是有一个问题,希望有人能回答我 我注意到,为了在屏幕上设置JLabel的动画,我需要设置组件的setlayout(null);和setbounds,然后最终设置setlocation(x,y)的动画这是制作组件动画的最佳实践还是糟糕的方法?我计划最终制作一个动画类,但我不想这样做,最终不得不放弃它 我已经包括了相关的代码,以便快速检查 im

经过反复研究,我发现最好通过扩展JLabel来实现自定义映像组件。到目前为止,这非常有效,因为我可以添加多个“图像”(jlabel),而不会破坏布局。我只是有一个问题,希望有人能回答我

  • 我注意到,为了在屏幕上设置JLabel的动画,我需要设置组件的
    setlayout(null);
    setbounds
    ,然后最终设置
    setlocation(x,y)的动画这是制作组件动画的最佳实践还是糟糕的方法?我计划最终制作一个动画类,但我不想这样做,最终不得不放弃它
我已经包括了相关的代码,以便快速检查

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;              
            }
        }
    }
}
谢谢大家!

我注意到为了使动画化 JLabels在屏幕上显示我需要 setlayout(null);以及 组件,然后设置动画 最终设置位置(x,y);。是这样吗 最佳实践还是糟糕的解决方法 为组件设置动画

嗯,这并不完全正确。您可以只玩位置,标签将在屏幕上移动。但是,如果您调整框架大小或任何内容,则将调用布局管理器,标签将被重新定位,并且布局管理器定义的位置在FlowLayout的情况下将位于页面的顶部/左侧动画将从那个位置继续。所以在现实中,是的,这正是你需要做的

我发现这是制作动画最简单的方法,因为Swing会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都是通过一个setLocation()方法实现的

有些人喜欢通过直接在面板上绘制图像来进行自定义绘制,但是你要负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这项工作太多了

我注意到为了使动画化 JLabels在屏幕上显示我需要 setlayout(null);以及 组件,然后设置动画 最终设置位置(x,y);。是这样吗 最佳实践还是糟糕的解决方法 为组件设置动画

嗯,这并不完全正确。您可以只玩位置,标签将在屏幕上移动。但是,如果您调整框架大小或任何内容,则将调用布局管理器,标签将被重新定位,并且布局管理器定义的位置在FlowLayout的情况下将位于页面的顶部/左侧动画将从那个位置继续。所以在现实中,是的,这正是你需要做的

我发现这是制作动画最简单的方法,因为Swing会自动重新绘制组件的“最后”位置(以恢复背景)以及绘制组件的新位置。这一切都是通过一个setLocation()方法实现的


有些人喜欢通过直接在面板上绘制图像来进行自定义绘制,但是您需要负责清除图像的旧位置,以便重新绘制背景,然后在新位置绘制图像。我觉得这项工作太多了。

感谢您的及时回复。正是我所需要的:)我现在有这个问题。当调整jframe jlable的大小显示在其初始位置时。是否有任何方法可以避免这种情况。我的意思是,即使在调整大小时,我也希望移动jlable而不显示在初始位置?感谢您的及时回复。正是我所需要的:)我现在有这个问题。当调整jframe jlable的大小时,它会显示在初始位置。有没有办法避免这种情况。我的意思是,即使在调整大小时,我也希望移动jlable而不显示在初始位置?