2012-04-12 114 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