2014-10-29 880 views
2

如果我通過像(1,1)(2,2)(3,3)這樣的輸入,如何在java中繪製一條線。點的數量可能會變化,如(1,1)(2,2)。真的很難讓這個工作正常。見下面Java輸入座標和繪製線

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class DrawGraph extends JPanel { 
private static final int MAX_SCORE = 20; 
private static final int PREF_W = 800; 
private static final int PREF_H = 650; 
private static final int BORDER_GAP = 30; 
private static final Color GRAPH_COLOR = Color.green; 
private static final Color GRAPH_POINT_COLOR = new Color(150, 50, 50, 180); 
private static final Stroke GRAPH_STROKE = new BasicStroke(3f); 
private static final int GRAPH_POINT_WIDTH = 12; 
private static final int Y_HATCH_CNT = 10; 
private List<Integer> scores; 

public DrawGraph(List<Integer> scores) { 
    this.scores = scores; 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    double xScale = ((double) getWidth() - 2 * BORDER_GAP)/(scores.size() - 1); 
    double yScale = ((double) getHeight() - 2 * BORDER_GAP)/(MAX_SCORE - 1); 

String s ="(220 616) (220 666) (251 670) (272 647)"; 
String[] arr = s.split("\\)\\s*"); 
List<Point> graphPoints = new ArrayList<Point>(); 
for (String anArr : arr){ 
    int x = Integer.parseInt(anArr.substring(1,anArr.indexOf(" "))); 
    int y = Integer.parseInt(anArr.substring(anArr.indexOf(" ") + 1, anArr.length())); 
    Point p = new Point(x,y); 
    graphPoints.add(p); 
} 
for (int i = 0; i < graphPoints.size() - 1; i++) { 
    int x1 = graphPoints.get(i).x; 
    int y1 = graphPoints.get(i).y; 
    int x2 = graphPoints.get(i + 1).x; 
    int y2 = graphPoints.get(i + 1).y; 
    g2.drawLine(x1, y1, x2, y2);   
    } 
} 

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

private static void createAndShowGui() { 
    List<Integer> scores = new ArrayList<Integer>(); 
    Random random = new Random(); 
    int maxDataPoints = 16; 
    int maxScore = 20; 
    for (int i = 0; i < maxDataPoints ; i++) { 
    scores.add(random.nextInt(maxScore)); 
    } 
    DrawGraph mainPanel = new DrawGraph(scores); 

    JFrame frame = new JFrame("DrawGraph"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(mainPanel); 

    frame.pack(); 
    frame.setLocationByPlatform(true); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 


    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowGui(); 
    } 
    }); 
} 
} 
+0

我已經張貼,我已經試過一次 – user2978472 2014-10-29 20:18:23

+0

OK一步的代碼。如果你打印出輸入字符串的解析,你是否得到正確的x和y值? – 2014-10-29 21:19:10

回答

0

我的代碼這應該讓你開始

見下面的例子。

public void paint(Graphics g){ 
     g.drawLine(x1, y1, x2, y2); 
     //then add the other point 
     g.drawLine(x2,y2,x3,y3) 
    } 

現在你需要分解你的點,並用一條畫線連接下一個點到上一個點。使用for循環和發佈您的代碼,我們將幫助您

也是這個code seems somewhat useful

+0

我已經嘗試過類似的方法。但它不工作... – user2978472 2014-10-29 20:19:23