2017-04-15 63 views
0

我想弄清楚如何迭代傳入數據點並在數據點進入時在JPanel上繪製圖形。要開始我只是試圖迭代列表DataPoints並繪製每一行(調用repaint)。我曾嘗試幾種方法可以做到這一點,但沒有運氣....Java Swing嘗試迭代列表並繪製每行

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class MyPanel extends JPanel{ 
    protected int x1 = 0; 
    protected int x2 = 0; 
    protected int y1 = 0; 
    protected int y2 = 0; 


    public MyPanel(){ 
     iteratePoints(); 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      JFrame frame = new JFrame(); 
      frame.setSize(500, 500); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
      frame.add(new MyPanel()); 

     } 
     }); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.GREEN); 
     System.out.println("In print"); 
     g.drawLine(x1, y1, x2, y2); 
    }; 

    private void iteratePoints(){ 
     System.out.println("iteratepoints"); 
     ArrayList<DataGrid> dataList = new ArrayList<DataGrid>(); 
     dataList.add(new DataGrid(0,4)); 
     dataList.add(new DataGrid(5,14)); 
     dataList.add(new DataGrid(10,1)); 
     dataList.add(new DataGrid(15,10)); 
     dataList.add(new DataGrid(20,14)); 
     dataList.add(new DataGrid(25,1)); 

     for(int i = 0; i<dataList.size(); i++) 
     { 

      x2 = dataList.get(i).x; 
      y2 = dataList.get(i).y; 

      this.repaint(); 
      x1 = x2; 
      y1 = y2; 
     } 

    } 

    private class DataGrid 
    { 
     public int x, y; 
     DataGrid(int x, int y) 
     { 
      this.x = x; 
      this.y = y; 
     } 
    } 

} 
+0

使您的列表成爲您班級的一個領域,而不是那些x和y變量。在你的paintComponent方法中,迭代線條並對其進行重複。 –

+0

問題在於,這些點最終會來自眼動儀(每幀)。所以我需要一種方法來繪製每一行,如果我將每行添加到列表並將其迭代到paintComponent中,那麼每一幀的整個列表將不得不重新迭代並重新繪製。這是做這件事的最好方法嗎? – jbg2408

+0

這可能就足夠了。 camickr在他的回答中告訴你,你也可以畫一個BufferedImage。 –

回答

1

您需要通過點的列表中paintComponent()方法循環,​​而不是在「iteratePoints()」方法。

使用您當前的方法,每次重繪都會簡單地清除以前的繪畫,並只繪製一條代表最近x/y值的線條。

另一種選擇是直接畫到BufferedImage

檢出Custom Painting Approaches兩個方法的工作示例。