Java Swing中的动画线条

Java Swing中的动画线条,java,swing,animation,amazon-ec2,Java,Swing,Animation,Amazon Ec2,我目前正在编写代码来创建一个监视工具,该工具监视Amazon Web服务和Amazon云,并可视化我当前运行的云基础设施 例如,如果CPU利用率或网络I/O增加了一些阈值,而不是调用自动缩放,并且向系统添加了一个新的EC2实例,则此代码运行良好,但现在我正在显示此活动的工具的GUI上可视化此内容。我正在使用JavaSwing创建监控工具 我需要的主要帮助如下: 我在框架顶部可视化客户机,在客户机下面可视化EC2实例,只是为了显示客户机和服务器之间的逻辑连接,我在客户机和EC2实例之间画了一条线

我目前正在编写代码来创建一个监视工具,该工具监视Amazon Web服务和Amazon云,并可视化我当前运行的云基础设施

例如,如果CPU利用率或网络I/O增加了一些阈值,而不是调用自动缩放,并且向系统添加了一个新的EC2实例,则此代码运行良好,但现在我正在显示此活动的工具的GUI上可视化此内容。我正在使用JavaSwing创建监控工具

我需要的主要帮助如下:

我在框架顶部可视化客户机,在客户机下面可视化EC2实例,只是为了显示客户机和服务器之间的逻辑连接,我在客户机和EC2实例之间画了一条线

现在,我需要对这些线条进行动画处理——可能是一条笔划线条缓慢移动,只是为了表明客户端和EC2实例之间存在一些流量。我还希望线条中的动画或笔划移动速度随着流量的增加而增加。(可能是设置动画速度的变量)


我需要关于如何在Java Swings中实现这些动画行的帮助。非常感谢您的帮助。

下面是一个从零开始移动完全绘制并设置动画的虚线的小示例:

private static int speed = 5;

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();
    frame.setLayout ( new BorderLayout () );

    frame.add ( new JComponent ()
    {
        private int diff = 0;

        {
            final Timer timer = new Timer ( 1000 / ( 10 * speed ), null );
            timer.addActionListener ( new ActionListener ()
            {
                public void actionPerformed ( ActionEvent e )
                {
                    if ( diff < 20 )
                    {
                        diff++;
                    }
                    else
                    {
                        diff = 0;
                    }
                    repaint ();
                    timer.setDelay ( 1000 / ( 10 * speed ) );
                }
            } );
            timer.start ();
        }

        protected void paintComponent ( Graphics g )
        {
            Graphics2D g2d = ( Graphics2D ) g;
            g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON );
            g2d.setStroke (
                    new BasicStroke ( 5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1f,
                            new float[]{ 10f, 10f }, diff ) );
            g2d.setPaint ( Color.BLACK );
            g2d.drawLine ( 0, getHeight () / 2, getWidth (), getHeight () / 2 );
        }
    } );
    frame.add ( new JSlider ( JSlider.HORIZONTAL, 1, 10, speed )
    {
        {
            addChangeListener ( new ChangeListener ()
            {
                public void stateChanged ( ChangeEvent e )
                {
                    speed = getValue ();
                }
            } );
        }
    }, BorderLayout.SOUTH );
    frame.setSize ( 500, 500 );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}
private static int speed=5;
公共静态void main(字符串[]args)
{
JFrame=newjframe();
frame.setLayout(新的BorderLayout());
frame.add(新的JComponent()
{
私有int-diff=0;
{
最终计时器=新计时器(1000/(10*速度),空值);
timer.addActionListener(新ActionListener()
{
已执行的公共无效操作(操作事件e)
{
如果(差值<20)
{
diff++;
}
其他的
{
差异=0;
}
重新油漆();
timer.setDelay(1000/(10*速度));
}
} );
timer.start();
}
受保护组件(图形g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHits.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(
新BasicStroke(5f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND,1f,
新浮点数[]{10f,10f},diff];
g2d.setPaint(颜色:黑色);
g2d.drawLine(0,getHeight()/2,getWidth(),getHeight()/2);
}
} );
frame.add(新的JSlider(JSlider.HORIZONTAL,1,10,speed)
{
{
addChangeListener(新的ChangeListener()
{
公共无效状态已更改(更改事件e)
{
速度=getValue();
}
} );
}
},南面);
框架尺寸(500500);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}

基本上,对于动画,您将需要绘制大多数要设置动画的内容。在您的例子中,如果两个对象用虚线连接,您可以使用绘制该连接的容器和放置在其上的简单Swing组件。因此,它将检测它们的边界并绘制连接线…

这里有一个小示例,显示从零开始移动完全绘制并设置动画的虚线:

private static int speed = 5;

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();
    frame.setLayout ( new BorderLayout () );

    frame.add ( new JComponent ()
    {
        private int diff = 0;

        {
            final Timer timer = new Timer ( 1000 / ( 10 * speed ), null );
            timer.addActionListener ( new ActionListener ()
            {
                public void actionPerformed ( ActionEvent e )
                {
                    if ( diff < 20 )
                    {
                        diff++;
                    }
                    else
                    {
                        diff = 0;
                    }
                    repaint ();
                    timer.setDelay ( 1000 / ( 10 * speed ) );
                }
            } );
            timer.start ();
        }

        protected void paintComponent ( Graphics g )
        {
            Graphics2D g2d = ( Graphics2D ) g;
            g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON );
            g2d.setStroke (
                    new BasicStroke ( 5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1f,
                            new float[]{ 10f, 10f }, diff ) );
            g2d.setPaint ( Color.BLACK );
            g2d.drawLine ( 0, getHeight () / 2, getWidth (), getHeight () / 2 );
        }
    } );
    frame.add ( new JSlider ( JSlider.HORIZONTAL, 1, 10, speed )
    {
        {
            addChangeListener ( new ChangeListener ()
            {
                public void stateChanged ( ChangeEvent e )
                {
                    speed = getValue ();
                }
            } );
        }
    }, BorderLayout.SOUTH );
    frame.setSize ( 500, 500 );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}
private static int speed=5;
公共静态void main(字符串[]args)
{
JFrame=newjframe();
frame.setLayout(新的BorderLayout());
frame.add(新的JComponent()
{
私有int-diff=0;
{
最终计时器=新计时器(1000/(10*速度),空值);
timer.addActionListener(新ActionListener()
{
已执行的公共无效操作(操作事件e)
{
如果(差值<20)
{
diff++;
}
其他的
{
差异=0;
}
重新油漆();
timer.setDelay(1000/(10*速度));
}
} );
timer.start();
}
受保护组件(图形g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHits.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(
新BasicStroke(5f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND,1f,
新浮点数[]{10f,10f},diff];
g2d.setPaint(颜色:黑色);
g2d.drawLine(0,getHeight()/2,getWidth(),getHeight()/2);
}
} );
frame.add(新的JSlider(JSlider.HORIZONTAL,1,10,speed)
{
{
addChangeListener(新的ChangeListener()
{
公共无效状态已更改(更改事件e)
{
速度=getValue();
}
} );
}
},南面);
框架尺寸(500500);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}

基本上,对于动画,您将需要绘制大多数要设置动画的内容。在您的例子中,如果两个对象用虚线连接,您可以使用绘制该连接的容器和放置在其上的简单Swing组件。因此,它将检测它们的边界并绘制连接线…

使用JPanel并覆盖其
paintComponent()
方法。此方法将负责动画

public void paintComponent(Graphics g)
 {
 super.paintComponent(g);
 g.setColor(Color.red); 
 g.drawLine(x1,y1,x2, y2); 
}
需要时再次增加x2。在您的情况下,需要在新连接时增加x2