在java中绘制线条(图形2D)

时间:2014-11-15 21:11:33

标签: java eclipse graphics 2d

我正在尝试在Eclipse上做一个小程序。程序是这样的:当我第一次点击框架上的thr面板时,必须绘制一条关于我的鼠标监听器的Y位置的线。该线占据了面板的所有宽度。在第二次单击时,必须绘制另一条线,再次关于我单击的位置的Y位置。之后,我会在两条线之间放一个小圆圈并用它制作一个小动画。 但现在,我有一个问题。当我单击面板时,会绘制一条线,但如果我再次单击,则第一行消失,第二行将其取消... 这是painComponent和我的mousr监听器的代码。这有什么问题?

public Lines() {
    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {

            posY=e.getY();
            posX=e.getX();
            nbClic=e.getClickCount();
            repaint();
        }

    });
    setBackground(Color.black);
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.blue);

    if(nbClic>=1){
        line1=new Line2D.Double(0, posY, getWidth(), posY);
        g2d.draw(line1);
        repaint();
    }
    if(nbClic>=2){
        g2d.setColor(Color.YELLOW);
        line2=new Line2D.Double(0, posY, getWidth(), posY);
        g2d.draw(line2);
    }
    repaint();
} 

1 个答案:

答案 0 :(得分:1)

绘画是绘制整个组件的事件。你不能依赖过去的事件,因为每次重绘都会被删除。

您需要保留List之类的内容,每次创建新行时,都会将其添加到List

List<Integer> yClicks = new ArrayList<>();

... {
    addMouseListener(new MouseAdapter() {
       @Override
        public void mouseClicked(MouseEvent e) {
            yClicks.add(e.getY());
            repaint();
        }
    });
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g.create();

    for(int y : yClicks) {
        g2d.draw(new Line2D.Double(0, y, getWidth(), y));
    }

    g2d.dispose();
}

此外:

  • 永远不要在repaint内拨打paintComponent!这将导致无休止的重绘周期。
  • paintComponent是受保护的方法,除非有令人信服的理由将其公开,否则应保持这种方式。
  • 小心更改传递给Graphics的{​​{1}}对象的状态,因为它在别处使用。通常我们会创建一个本地副本,在我们完成时将其处理。