2014-01-07 147 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/但这是我的长期项目,所以它有点大。