我正在尝试使用鼠标侦听器创建一个笔工具:
public void mouseDragged(MouseEvent e) {
imageL.setCoordinates(originalPos, e.getPoint());
imageL.repaint();
originalPos = e.getPoint();
}
JLabel(imageL)中的绘制功能接收两组点,这些点允许根据鼠标拖动绘制一条线。唯一的问题是,每次执行拖动时,新图层都不包含从上一次鼠标拖动绘制的线条。 JLabel的绘制功能如下:
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(drawingColour);
g2d.drawLine(originCors.x,originCors.y,endCors.x,endCors.y);
}
基本上我的问题是:如何将新行“添加”到当前图层?
任何帮助都会很棒, 提前致谢
答案 0 :(得分:3)
您希望绘制JComponent(和JLabel从JComponent扩展)paintComponent方法,而不是绘制方法,除非您计划处理组件的边框和子项的所有绘制。接下来,您可能希望让绘图组件包含Point的ArrayList,并在mouseDragged方法中将Points添加到此数组列表中。然后paintComponent方法可以遍历列表并绘制所有行。如果您只想绘制一条线,那么让绘画JLabel在类字段中保存两个点。
答案 1 :(得分:2)
迈克尔,
首先,在swing中(JLabel是一个swing组件,与旧的AWT库相对应),建议的做法是覆盖paintComponent
方法(而不是“paint”方法)。有关hows&amp ;;的信息,请参阅The Java Tutorials: Custom Painting为什么呢。
如果你想自定义绘制一个行列表,那么你将不得不这样做...而不仅仅是“新”行。解决这个问题的一种方法是用每个新行“更新”一个图像,然后自定义绘制......这只是稍微快一点,因为你只需要“画”一行一次,代价是使用更多内存(维护“背景图像”)......但这种技术有助于“双缓冲”,避免了直接绘制到屏幕时“闪烁”。有关详细信息,请参阅The Java Tutorials: Working with Images。它实际上很直接。
我建议你谷歌搜索“java双缓冲示例”(避免玫瑰印度,它充满了垃圾)。
干杯。基思。