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

Ripple动画java

澹台衡
2023-03-14

我一直在使用Swing编写一个简单的动画,其中有一个JFrame,只要JFrame收到鼠标点击,就会开始一个涟漪动画。我使用一个内部动画类,该类为每个动画扩展JPanel,以防同时播放多个动画(我不知道这是否是最好的方式)。当我单击时,我向JFrame添加一个新动画,并将单击的坐标传递给动画。但是,动画重绘/绘制组件方法不起作用。在我的理解中,repaint应该调用paint/paintComponent方法,但在故障排除中,这些方法甚至都没有被访问。那么我该如何执行绘制方法呢?提前谢谢。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.*;

public class Ripples extends JFrame {
public Ripples() {
    // window
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Ripples");
    setBounds(250, 250, 1000, 1000);
    setVisible(true);
    addMouseListener(new MouseListener() {

        public void mousePressed(MouseEvent e) {
            Animation animation = new Animation(e.getX(), e.getY());
            add(animation);
        }

        public void mouseReleased(MouseEvent e) {

        }

        public void mouseClicked(MouseEvent e) {

        }

        public void mouseEntered(MouseEvent e) {

        }

        public void mouseExited(MouseEvent e) {

        }
    });
}

public static void main(String[] args) {
    Ripples demo = new Ripples();
}

class Animation extends JPanel{
    private int radius;
    private int x;
    private int y;
    private Timer timer;

    Animation(int x, int y) {
        this.x = x;
        this.y = y;
        radius = 0;

        timer = new Timer(10, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (radius > 200) {
                    resetRadius();
                    timer.stop();
                }
                increaseRadius();
                repaint();
            }
        });
        timer.start();
    }

    public void increaseRadius() {
        radius += 1;
    }

    public void resetRadius() {
        radius = 0;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.drawOval(x - (radius / 2), y - (radius / 2), radius, radius);
    }
}

}

共有1个答案

鞠嘉誉
2023-03-14

当我单击时,我向JFrame添加一个新动画,并将单击的坐标传递给动画。但是,动画重绘/绘制组件方法不起作用。

默认情况下,Swing组件的默认大小为(0,0),因此没有要绘制的内容。

将组件添加到可见GUI时,需要调用布局管理器,以便为组件指定大小/位置。基本代码是:

panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed

在您的情况下,您将动画面板添加到框架的内容窗格中,因此您需要重新验证()框架。

 类似资料:
  • 我试图添加一个按钮点击涟漪动画。我确实喜欢下面的内容,但它需要从版本到21。 涟漪xml 按钮 我想让它向下兼容设计库。 如何做到这一点?

  • Ripple是世界上第一个开放的支付网络,通过这个支付网络可以转账任意一种货币,包括美元、欧元、人民币、日元或者比特币,简便易行快捷,交易确认在几秒以内完成,交易费用几乎是零,没有所谓的跨行异地以及跨国支付费用。 Ripple是开放源码的点到点支付网络,它可以使你轻松、廉价并安全的把你的金钱转账到互联网上的任何一个人,无论他在世界的哪个地方。因为Ripple是p2p软件,没有任何个人、公司,或政府

  • Touch Ripple is supported only in Material Theme Framework7 Material Theme comes with great an dynamic implementation of Material Touch Ripple effect. Enable Touch Ripple It is enabled by default for

  • Ripple 是一个为 Dart 语言实现的轻量级消息服务器。当前支持 STOMP 消息协议。

  • Nativescript-Ripple This plugin aims to bring a native (or close to native) ripple implementation on Android and iOS. The android version uses a RippleDrawable and conserves the previous background, a

  • Material Ripple Layout Ripple effect wrapper for Android Views Including in your project compile 'com.balysv:material-ripple:1.0.2' Check for latest version number on the widget below or visit Release