2014-01-07 209 views
0

已解決。如何在Java中繪製交互式圖形/線條?

我之前有一個問題,但它是非常糟糕的發佈,所以這裏再次,根據更好的規則。

我想創建一個圖形的一些風格像這樣的圖片:

enter image description here

它是基於物理法,Snell's Law。到目前爲止,我已經設法用一個基本的Line2D.Double自己繪製圖形,你可以看到here (Line.java)。然後,所有我需要做的是,在接口類,在該類中的行添加到陣列像這樣:

LinesArray.addLine(150 , 25 , 150 , 275); 

每一次它增加了一個新的,它重新繪製,你可以在代碼中看到樣品。

但問題是,我不知道如何使這個互動。我想讓它變成互動的,因爲你可以實際移動這些線條,同時你移動第一條線,第二條線會根據斯涅爾定律公式移動,即:

n1 * sin (a1)= n2 * sin(a2)

考慮到a1是第一個圖像中的第一個(左)角,而a2是第二個(右)角。

我希望實現的一個完美例子是this one。 如果互動運動太困難(我在2天的時間表),this example也是一種可能性。

糾正我,如果我錯了,但對於第二個,我需要做的就是計算鼠標的座標並繪製並計算從那裏的一切。

Here (menu_ui.java)是我的接口類,其中我正在使用的行的方法是「menuSnell()」和here (Snell.java是包含邏輯的我的Snell類。對於葡萄牙語的評論道歉,但它是相當簡單的代碼,你並不真正需要評論來理解,再加上我已經分離成可讀的方法。

所以基本上,我的問題是我如何使這些線以上述方式互動。

謝謝!

+1

你需要爲你的組件添加一個'MouseListener',監控鼠標點擊並確定點擊是否在一條線上...... – MadProgrammer

+0

是的 - 這是完全正確的。你需要1)在一個面板(或等同物)中繪製你的圖像,2)添加一個「MouseListener」(觸發一個「事物已更改」事件),3)讓鼠標事件「重繪()」你的圖形對象, 4)子類「paint()」來調用你的圖形代碼。這裏有一個很好的教程:http://docs.oracle.com/javase/tutorial/2d/advanced/user.html – FoggyDay

回答

1

我不是圖形專家,但很久以前我也有過類似的工作。我有一個對象,我需要重繪。我創建了自己的JPanel,它保存了我應該繪製的對象。無論什麼時候改變,我都會在JPanel上調用repaint方法。它看起來像這樣 http://sourceforge.net/p/scribbler-cvut/code/132/tree/Tuzka/src/cz/cvut/scribbler/panel/RewritableGlassPane.java

private LinkedList<ColoredArea> background = new LinkedList<ColoredArea>(); 
/** 
* Vykreslí všechny položky v senamu vykreslených obrazců 
* @param g2d grafika k vykreslení 
*/ 
public void paintShape(Graphics2D g2d) { 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    for (ColoredArea area : background) { 
     area.fill(g2d); 
    } 
    if (mouse != null && !block) { 
     g2d.setColor(mouse_color); 
     g2d.draw(mouse); 
    } 
    if (point!=null){ 
     SetPointsDialog.paintPoints(point, maxPoint, parent.getChildsSize(), g2d); 
    } 
} 

@Override 
public void paint(Graphics g) { 
    paintShape((Graphics2D) g); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    paintShape((Graphics2D) g); 
} 

我需要繪製的一切都存儲在背景變量中。當LinkedList發生變化時,我調用窗口上的repaint()方法。

我有一個完整的源代碼存儲在這裏:http://sourceforge.net/projects/scribbler-cvut/但這是我的長期項目,所以它有點大。