2012-04-12 97 views
1

我目前正在编写用于创建监视Amazon Web Services和Amazon Cloud的监视工具的代码,并可视化我当前运行的云基础架构。Java Swing中的动画线

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

我所需要的主要帮助是如下:

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

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

我需要帮助我如何在Java Swings中实现这样的动画线。任何帮助,高度赞赏。

+0

* “最好的问候ACoder” *请留下SIGS。出问题。 – 2012-04-12 20:05:39

回答

2

这里是移动虚线画完全从零动画的一个小例子:

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); 
} 

基本上动画,你需要画你最想动画的东西。在你的情况下,如果它是两个虚线连接的对象 - 你可以使用容器来绘制连接,并且只需简单的Swing组件就可以了。因此它会检测到它们的边界并绘制连接线...

+0

请简单地扩展JPanel,而不是在主类内编写类... – jpalm 2012-04-12 18:03:38

+0

对'RenderingHints'使用+1,并使用'javax.swing.Timer'来调整动画的速度;一个完全合格的名字会很好,但签名是可识别的。 @jjiceman:[_double大括号初始化_](http://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-in-java)有点模糊;如果你在另一个答案中发布了一个用于比较的未解决的变体,就可以ping我。 – trashgod 2012-04-12 18:32:01

+0

@jjiceman这个例子可以在任何其他类中快速执行,这就是为什么我总是用包含的主要方法编写最短的例子。但我想我会做你接下来的例子:) – 2012-04-12 19:57:27

1

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

public void paintComponent(Graphics g) 
{ 
super.paintComponent(g); 
g.setColor(Color.red); 
g.drawLine(x1,y1,x2, y2); 
} 

增量再次X2 required.In你的情况下,需要做增量X2当新的连接是由服务器处理。 希望这会帮助你。

+1

我已更新它。谢谢 – UVM 2012-04-12 15:57:52