2017-06-10 41 views
0

我正在使用Graphics2D,PointLine2D(用于BrushStroke)来创建一个自由绘图程序(用于教育目的)。我的问题是,我可以使用鼠标拖动来绘制线条,但它始终始于从左上角JPanel到释放鼠标按钮的位置。我希望能够使用Point(E.G Point startPoint,endPoint)在鼠标正在移动时绘制,释放时停止绘制,并在再次按下鼠标时开始绘制新点。有人可以通过鼠标监听器(mousedragged,...按下,...释放等)来帮助我进行编码吗?Java 8 Graphics2D,使用鼠标拖动鼠标时使用点(E.G Point pointStart)

public class GraphicsPanel extends JPanel implements MouseMotionListener, MouseListener { 

private Color color; 
private JColorChooser cc; 
private JComboBox paintToolBox; 

Point pointStart = null; 
Point pointEnd = null; 

GraphicsPanel(JColorChooser cc, Color color, JComboBox paintToolBox) { 
    this.cc = cc; 
    this.color = color; 
    this.paintToolBox = paintToolBox; 
    addMouseMotionListener(this); 

} 

@Override 
public void paint(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(cc.getColor()); 
    Line2D line2D = new Line2D.Double(pointStart, pointEnd); 

    if (pointStart != null || pointEnd != null) { 
     g2d.draw(line2D); 
    } 
} 

@Override 
public void mouseDragged(MouseEvent e) { 

} 

@Override 
public void mouseMoved(MouseEvent e) { 

} 

@Override 
public void mouseClicked(MouseEvent e) { 

} 

@Override 
public void mousePressed(MouseEvent e) { 

} 

@Override 
public void mouseReleased(MouseEvent e) { 

} 

@Override 
public void mouseEntered(MouseEvent e) { 

} 

@Override 
public void mouseExited(MouseEvent e) { 

} 

}

+1

参见[自定义绘画途径(https://tips4java.wordpress.com/2009/05/08/custom-painting-approaches /)来进行这种绘图的两种常用方法的工作示例。这些示例绘制了一个矩形,但概念是相同的。 – camickr

+0

谢谢你,将调查它。 –

回答

0

建议:

  • 首先总是重写paintComponent,不画
  • 而且总是打电话给你的覆盖范围内的超级绘画方法
  • 你有两个选择:
    1. Op重刑1:
      • 创建一个ArrayList<Line2D>作为一个实例字段
      • 创建线路,并放入你的鼠标/ MOUSEMOTION听众在这个名单
      • 然后调用重绘并通过的paintComponent方法中使用这个列表循环,画线
    2. 选项2:
      • 创建一个BufferedImage,作为实例字段
      • 在您的鼠标/鼠标移动侦听器上绘制该图像
      • 然后在您的paintComponent方法中绘制图像。
  • 无论哪种方式,新的生产线在开始的mousePressed,是完全的mouseReleased
+0

我不会想到在ArrayList实例中使​​用Line2D,我尝试使用ArrayList ,但没有完全产生我期待的结果。谢谢!我会尝试的! –

+0

点也可以工作 –