2013-11-02 3 views
1

나는 에이전트의 위치를 ​​나타내는 scatterplot을 가지고 있습니다. 이 위치가 바뀝니다. 새로운 위치로 산점도를 다시 그리거나 다시 그릴 수있는 방법이 궁금합니다.jfreechart에서 ScatterPlot을 동적으로 다시 그립니다.

my 그리기 방법. updatePositions 함수에서 다시 그리기해야합니다. ScatterPlot에 대한 리스너를 구현할 수있는 방법이 있습니까?

private ChartPanel createPanel() { 
    JFreeChart jfreechart = ChartFactory.createScatterPlot(
      title, "", "", initPositions(),PlotOrientation.VERTICAL, true, true, false); 
    XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
    xyPlot.setDomainCrosshairVisible(true); 
    xyPlot.setRangeCrosshairVisible(true); 
    XYItemRenderer renderer = xyPlot.getRenderer(); 
    renderer.setSeriesPaint(0, Color.blue); 
    adjustAxis((NumberAxis) xyPlot.getDomainAxis(), true); 
    adjustAxis((NumberAxis) xyPlot.getRangeAxis(), false); 
    xyPlot.setBackgroundPaint(Color.white); 
    return new ChartPanel(jfreechart); 
} 

private void adjustAxis(NumberAxis axis, boolean vertical) { 
    axis.setRange(-1, lattice+1); 
    axis.setTickUnit(new NumberTickUnit(1)); 
    axis.setVerticalTickLabels(vertical); 
} 

private XYDataset initPositions() { 
    XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 

    for (int i = 0; i < populationSize; i++) { 
     if(population.get(i).status==1){ 
      healthy.add(population.get(i).position[0], population.get(i).position[1]); 
     }else if(population.get(i).status==2){ 
      infected.add(population.get(i).position[0], population.get(i).position[1]); 
     }else if(population.get(i).status==3){ 
      recovered.add(population.get(i).position[0], population.get(i).position[1]); 
     } 
    } 

    xySeriesCollection.addSeries(healthy); 
    xySeriesCollection.addSeries(infected); 
    xySeriesCollection.addSeries(recovered); 
    return xySeriesCollection; 
} 

public void clear(){ 
    healthy.clear(); 
    infected.clear(); 
    recovered.clear(); 
} 
public void updatePositions(ArrayList<Person> pop){ 
    population = pop; 

    for (int i = 0; i < populationSize; i++) { 
     if(population.get(i).status==1){ 
      healthy.addOrUpdate(population.get(i).position[0], population.get(i).position[1]); 
     }else if(population.get(i).status==2){ 
      infected.addOrUpdate(population.get(i).position[0], population.get(i).position[1]); 
     }else if(population.get(i).status==3){ 
      recovered.addOrUpdate(population.get(i).position[0], population.get(i).position[1]); 
     } 
    } 
} 

이것은 주 클래스의 메소드입니다. 아래와 같이 위치의 업데이트는 "이동"기능

public static void main(String [] args){ 
    createPopulation(populationSize); 
    initInfection(infectRatio); 

    EventQueue.invokeLater(new Runnable() {    
     @Override   
     public void run() {   
      DrawArea demo = new DrawArea("Demo", lattice, populationSize,population);    
      demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
      demo.pack();     
      demo.setLocationRelativeTo(null);    
      demo.setVisible(true); 
      for(int i =0;i<1000;i++){ 

       for(int j=0; j<populationSize; j++){ 
        population.get(j).move(0.8); 
       } 
       demo.clear(); 
       demo.updatePositions(population); 
      } 
     }   
    }); 
} 

답변

1

에서 수행되면, 표 (뷰)는 데이터 세트 (모델) 그에 따라 업데이트 자체를 청취. 이동 단추를 누르면 계열의 각 XYDataItemupdate()에서 수정되어 새 위치가 반영됩니다.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.util.*; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.axis.NumberTickUnit; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.data.xy.XYDataItem; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

/** 
* @see http://stackoverflow.com/a/19749344/230513 
* @see http://stackoverflow.com/a/7208723/230513 
*/ 
public class ScatterMove extends JFrame { 

    private static final int N = 16; 
    private static final String title = "Scatter Move Demo"; 
    private static final Random rand = new Random(); 
    private XYSeries moved = new XYSeries("Population"); 

    public ScatterMove(String s) { 
     super(s); 
     update(); 
     final ChartPanel chartPanel = createDemoPanel(); 
     this.add(chartPanel, BorderLayout.CENTER); 
     JPanel control = new JPanel(); 
     control.add(new JButton(new AbstractAction("Move") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       moved.clear(); 
       update(); 
      } 
     })); 
     this.add(control, BorderLayout.SOUTH); 
    } 

    private void update() { 
     for (int i = 0; i < N; i++) { 
      moved.add(new XYDataItem(rand.nextGaussian(), rand.nextGaussian())); 
     } 
    } 

    private ChartPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      title, "X", "Y", createSampleData(), 
      PlotOrientation.VERTICAL, true, true, false); 
     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis(); 
     domain.setRange(-3.0, 3.0); 
     domain.setTickUnit(new NumberTickUnit(1)); 
     NumberAxis range = (NumberAxis) xyPlot.getRangeAxis(); 
     range.setRange(-3.0, 3.0); 
     range.setTickUnit(new NumberTickUnit(1)); 
     return new ChartPanel(jfreechart){ 

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

    private XYDataset createSampleData() { 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     xySeriesCollection.addSeries(moved); 
     return xySeriesCollection; 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ScatterMove demo = new ScatterMove(title); 
       demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       demo.pack(); 
       demo.setLocationRelativeTo(null); 
       demo.setVisible(true); 
      } 
     }); 
    } 
} 
+0

image

잘 내 수면의 xD을 간다. 나는 그것을 시도 할 것이다 고맙다. 무거운 수정 (다른 클래스의 포인트가 변경되어 매번 포인트를 업데이트/패스 - 투 - 클래스로 변경해야 함) – MayTheSchwartzBeWithYou

+1

삭제 및 추가하는 대신 추상을보고 확장하는 것이 좋습니다 [XYDataset]을 구현하는 클래스입니다 (여기 [http://stackoverflow.com/a/12481509/230513]). – trashgod

관련 문제