【问题标题】:Drawing lines in java (Graphics 2D)在java中绘制线条(图形2D)
【发布时间】:2014-11-15 21:11:33
【问题描述】:

我正在尝试在 Eclipse 上做一个小程序。程序是这样的:当我第一次点击框架上的面板时,必须绘制一条关于我的鼠标监听器的 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();
} 

【问题讨论】:

    标签: java eclipse graphics 2d


    【解决方案1】:

    Painting 是一个绘制整个组件的事件。您不能依赖过去的事件,因为每次重绘时它们都会被删除。

    您需要保留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();
    }
    

    还有:

    • 切勿在paintComponent 内拨打repaint!这将导致无休止的重绘循环。
    • paintComponent 是一种受保护的方法,除非有令人信服的理由将其公开,否则应保持这种状态。
    • 注意将传入的Graphics 对象的状态更改为paintComponent,因为它在其他地方使用。通常我们会创建一个本地副本,在我们完成后处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2013-09-03
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2021-06-16
      相关资源
      最近更新 更多