当前位置: 首页 > 知识库问答 >
问题:

创建在自身上循环的动画文本

辛健
2023-03-14

这是我到目前为止得到的,代码大量从这里借来:Java Animate JLabel,所以如果您在那里看到任何不需要的代码,请让我知道。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.EnumMap;
import javax.swing.*;

@SuppressWarnings("serial")
public class AnimateExample extends JPanel {
    private static final int TIMER_DELAY = 20;
    private static final String KEY_DOWN = "key down";
    public static final int TRANSLATE_SCALE =2;
    private static final Font BG_STRING_FONT = new Font(Font.SANS_SERIF,
            Font.BOLD, 32);
    private EnumMap<Direction, Boolean> dirMap = 
            new EnumMap<AnimateExample.Direction, Boolean>(Direction.class);
    private BufferedImage image = null;
    private int posX = 100;
    private int posY = 50;
    Timer t;

    public AnimateExample() {
        for (Direction dir : Direction.values()) {
            dirMap.put(dir, Boolean.TRUE);
        }
        t = new Timer(TIMER_DELAY, new TimerListener());
        t.start();


        ActionMap actionMap = getActionMap();
        for (final Direction dir : Direction.values()) {
            actionMap.put(dir.Left + KEY_DOWN, new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    dirMap.put(dir, true);
                }
            });
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g.setFont(BG_STRING_FONT);
        g.setColor(Color.LIGHT_GRAY);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

        String s = "Hi, I'm trying to make a news ticker type thing where a string is entered and inside of a JPanel the text is looped.I know it moves currently at about 90 pixels a second and that there is about 16 pixels per char in this font. So what I am asking is how I can use this information to make it so that after a timer runs for a certain time, a new animated text is spawned, and how after the 1st animated text leaves the screen completely, how to delete it from the memory.";

        g.drawString(s, posX, posY);

    }

    private class TimerListener implements ActionListener {
        public void actionPerformed(java.awt.event.ActionEvent e) {
            for (Direction dir : Direction.values()) {
                if (dirMap.get(dir)) {
                    posX += dir.getX() * TRANSLATE_SCALE;
                    posY += dir.getY() * TRANSLATE_SCALE;
                }
            }
            repaint();
            if(posX<-500)
            {
                t.stop();
            }
        };
    }

    enum Direction {
        Left( KeyEvent.VK_LEFT, -1, 0);

        private int keyCode;
        private int x;
        private int y;

        private Direction(int keyCode, int x, int y) {
            this.keyCode = keyCode;
            this.x = x;
            this.y = y;
        }
        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }

    private static void createAndShowGui() {
        AnimateExample mainPanel = new AnimateExample();

        JFrame frame = new JFrame("Animate Example");
        frame.setUndecorated(true);
        frame.setSize(1600, 900);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.add(mainPanel);
        mainPanel.setBounds(new Rectangle(1600,400));
        frame.setVisible(true);    
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

编辑:我也在考虑也许在一定的时间或距离后重置X位置,但问题是这将要求该区域在一个屏幕长度内是空白的。如果你有一个工作周围,这也将是伟大的。

共有1个答案

萧宣
2023-03-14

你可以看看选框面板。它使用了与大多数滚动器不同的方法。您将实际的组件添加到面板和组件滚动。

这允许您滚动文本或图像。您可以使用标签与HTML这样您可以有彩色文本等消息将继续滚动,直到您手动停止滚动。

目前还没有自动替换滚动消息的机制。尽管您可以轻松地创建消息列表或队列。然后,当一条消息完全完成滚动时,您只需删除当前消息并添加一条新消息。

public void actionPerformed(ActionEvent ae)
{
    scrollOffset = scrollOffset + scrollAmount;
    int width = super.getPreferredSize().width;

    if (scrollOffset > width)
    {
        scrollOffset = isWrap() ? wrapOffset + scrollAmount : - getSize().width;
        //  add code here to swap component from the List or Queue 
    }

    repaint();
}
 类似资料:
  • 问题内容: 我写了这段代码,将图像加载到ImageView小部件中: 现在,我要加载多个图像。为此,我需要动态创建图像视图,但是我不知道如何… 我想在for循环中运行我的代码: 我的主要问题是在循环内动态创建多个ImageView 问题答案: 您可以根据需要修改布局,图像资源和任何图像(也可以是动态的)…

  • 问题内容: 在c ++或c编程语言中,我们知道要使用gotoxy(x,y)来更改坐标,并且可以使用循环和睡眠来更改坐标并制作动画。像这样; 但是我的问题是在JAVAFX 2.0编程中如何?我正在使用netbeans 7.2。感谢您的帮助。 问题答案: 看一下使用时间轴动画。它是JavaFX中动画的关键组成部分, 用于确定动画的关键部分何时以及以什么顺序出现。 这是一个例子

  • 关于 Flash 图形 Flash (SWF) 文件格式是一种基于矢量的图形文件格式,它用于适合 Web 的可缩放小尺寸图形。由于这种文件格式基于矢量,因此,图稿可以在任何分辨率下保持其图像品质,并且非常适于创建动画帧。在 Illustrator 中,可以在图层上创建单独的动画帧,然后将图像图层导出到网站上使用的单独帧中。也可以在 Illustrator 文件中定义符号以减小动画的大小。在导出后,

  • 问题内容: 在ViewController.Swift中,我设法使一个盒子从一个点动画到另一个点。我认为将其循环很容易,因此框将动画到一个点,然后再动画回到其原始位置,然后再次循环。我已经设法将对象移到某个位置,并在“完成”后再次将其移回,但这并没有使我循环。如何做到这一点? 我以为这也许行得通,但老实说我不知道​​: 如何根据设备宽度居中(我假设涉及数学运算?)? 我的代码: 问题答案: 无需执

  • 我试图在一个循环中的两个上播放动画,其中ImageViews的图像在每个循环中都发生变化,但正如预期的那样,用户只看到最后一个图像和动画。 在其他文章中,我尝试了和等方法,但都没有成功。 该程序的目的是让用户选择9张照片,然后根据照片的RGB构图与计算机图像进行岩石-纸-剪刀式的格斗。 程序从两个数组列表中获取ImageViews的照片,是drawable文件夹中文件名字符串的数组列表,以及是的数

  • 关于 Flash 图形 Flash (SWF) 文件格式是一种基于矢量的图形文件格式,它用于适合 Web 的可缩放小尺寸图形。由于这种文件格式基于矢量,因此,图稿可以在任何分辨率下保持其图像品质,并且非常适于创建动画帧。在 Illustrator 中,可以在图层上创建单独的动画帧,然后将图像图层导出到网站上使用的单独帧中。也可以在 Illustrator 文件中定义符号以减小动画的大小。在导出后,