1

我正在尝试使用鼠标侦听器创建一个钢笔工具:

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);
}

所以基本上我的问题是:如何将新行“添加”到当前层?

任何帮助都会很棒,在此先感谢

4

2 回答 2

3

您想要绘制 JComponent(并且 JLabel 从 JComponent 扩展)的paintComponent 方法,而不是paint 方法,除非您计划处理组件边框和子项的所有绘制。接下来,您可能希望您的绘图组件持有一个 Point 的 ArrayList,并在 mouseDragged 方法中将 Points 添加到此数组列表中。然后paintComponent 方法可以遍历列表并绘制所有行。如果您只想画一条线,那么让绘画 JLabel 将两个点都保存在一个类字段中。

于 2011-05-07T01:04:03.960 回答
2

迈克尔,

首先,在swing(JLabel 是一个swing 组件,与旧的AWT 库相对)中,推荐的做法是覆盖该paintComponent方法(而不是“paint”方法)。有关它的方法和原因,请参阅Java 教程:自定义绘画

如果您想自定义绘制行列表,那么您将不得不这样做……而不仅仅是“新”行。解决此问题的一种方法是使用每个新行“更新”图像,然后自定义绘制...这会稍微快一些,因为您只需“绘制”每行一次,代价是使用更多内存(以维护“背景图像”)......但是这种技术适用于“双缓冲”,它可以避免直接在屏幕上绘制时出现的“闪烁”。有关详细信息,请参阅Java 教程:使用图像。这实际上很简单。

我建议你在谷歌上搜索“java 双缓冲示例”(避免使用 Rose India,它充满了废话)。

干杯。基思。

于 2011-05-07T01:18:50.803 回答