2015-09-17 42 views
1

我想製作一個程序來模擬螞蟻。比方說,我有100只螞蟻,每個座標都有座標(2 integers)。我使用Java Graphics(Graphics2D)。用座標列表更新G2D

現在我想一個類,倒像是一個列表:

List<List<Integer>> list = new ArrayList(); 

該列表例如:

[100,200],[200,100]

爲座標在裏面。現在我想讓班級更新時間並刪除所有「點」(螞蟻),然後在列表中繪製新的座標。

現在這是行不通的。

public class FrameHandler { 

Panel panel = new Panel(); 

public FrameHandler() { 
    //initialize frame 
    frame.repaint(); 

    List<List<Integer>> test = new ArrayList(); 
    List<Integer> t1 = new ArrayList(); 
    t1.add(100); 
    t1.add(200); 
    test.add(gunther); 

    frame.add(panel); 

    panel.setList(test); 

    //the thread sleeps for 5 seconds 

    List<Integer> t2 = new ArrayList(); 
    t2.add(100); 
    t2.add(100); 
    test.add(gunther2); 

    panel.removeAll(); 

    panel.setList(olaf); 
} 


public void setList(List<Integer> list) { 
    panel.setList(list); 
} 

public void setSize(int width, int height) { 
    frame.setSize(width, height); 
} 

private class Panel extends JPanel { 

    List<List<Integer>> antList = new ArrayList(); 

    private void doDrawing(Graphics g) { 

     Graphics2D g2d = (Graphics2D) g; 

     for(int i = 0; i < antList.size(); i++) { 
      g2d.fillRect(antList.get(i).get(0), antList.get(i).get(1), 2, 2); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     doDrawing(g); 
    } 

    public void setList(List<List<Integer>> list) { 
     antList = list; 
    } 
} 

} 

如果您有其他的想法如何解決這個問題,也許有一個API或做圖形的另一種方法,我會很高興聽到這個消息。

+0

*「現在我想讓班級更新時間並刪除所有的」點「(螞蟻),然後在列表中將它們繪製爲新的座標。 「* - 這很像繪畫在Swing中的工作原理。您可能需要使用Swing'Timer'來更新'List'並重新計劃繪製事件,請參見[如何使用Swing定時器](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer .html)瞭解更多詳情 – MadProgrammer

回答

1

現在我希望類更新人的時間,並刪除所有「點」(蟻),之後吸引他們與新的座標淘汰之列。

這基本上是如何繪製在Swing中的工作,在每個繪製週期中,您都需要從零開始重新繪製組件的整個狀態。有關更多詳細信息,請參見Painting in AWT and Swing

所以問題就變成了,你如何更新List。雖然有多種方式可以做到這一點,但使用Swing Timer可能是最簡單的(也是最安全的)。有關更多詳細信息,請參見How to use Swing Timers

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FrameHandler { 

    public static void main(String[] args) { 
     new FrameHandler(); 
    } 

    public FrameHandler() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class TestPane extends JPanel { 

     protected static final Random RANDOM_DELTA = new Random(); 

     private List<List<Integer>> ants; 

     public TestPane() { 
      Random rnd = new Random(); 
      ants = new ArrayList<>(25); 
      for (int index = 0; index < 10; index++) { 
       List<Integer> ant = new ArrayList<>(2); 
       // You should also have a look at the java.awt.Point class :P 
       ant.add(rnd.nextInt(200 - 2)); //x 
       ant.add(rnd.nextInt(200 - 2)); //y 
       ants.add(ant); 
      } 

      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 

        for (List<Integer> ant : ants) { 
         int xDelta = randomDelta(); 
         int yDelta = randomDelta(); 

         int x = ant.get(0) + xDelta; 
         int y = ant.get(1) + yDelta; 

         if (x < 0) { 
          x = 0; 
         } else if (x + 2 > getWidth()) { 
          x = getWidth() - 2; 
         } 
         if (y < 0) { 
          y = 0; 
         } else if (y + 2 > getHeight()) { 
          y = getHeight() - 2; 
         } 

         ant.set(0, x); 
         ant.set(1, y); 
        } 
        repaint(); 

       } 
      }); 
      timer.start(); 
     } 

     protected int randomDelta() { 
      int delta = 0; 
      do { 
       double rnd = Math.random(); 
       delta = rnd < 0.5d ? -1 : 1; 
      } while (delta == 0); 
      return delta; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (List<Integer> ant : ants) { 
       g2d.fillRect(ant.get(0), ant.get(1), 2, 2); 
      } 
      g2d.dispose(); 
     } 

    } 

} 

此示例基本上生成每個螞蟻的X & y座標的隨機增量(在方向改變)。我懷疑你可能需要一些更復雜的東西