【问题标题】:Drawing ZigZags in Java在 Java 中绘制之字折线
【发布时间】:2011-10-07 16:21:49
【问题描述】:

我有一个设计项目,我应该使用我的鼠标在 Java 中绘制锯齿形。首先,我使用的是 MouseListener,在 mouseClicked 方法中,我收集了用户点击的所有点:

 public void mouseClicked(MouseEvent e){
    if(isAbleToDraw){
    corners[points]=e.getPoint();
        points++;
        repaint();
    }
 }

这里我使用布尔值“isAbleToDraw”来检查用户是否点击了“绘图”或“停止绘图”按钮。 然后,我画出这样的锯齿形:

 super.paintComponent(graph);
 Graphics2D g = (Graphics2D) graph;
 g.drawLine(corners[i].x, corners[i].y, corners[i+1].x, corners[i+1].y);

最后,问题是,当我在绘制锯齿形后单击“停止绘制”按钮,然后再次单击“绘制”按钮后,它一直从它离开的最后一点开始绘制线条。换句话说,我不能画出 2 个不同的独立之字形。

知道如何解决这个问题吗?

【问题讨论】:

    标签: java event-handling drawing java-2d


    【解决方案1】:

    如果您希望用户能够绘制多个之字形并在屏幕上看到它们,那么您可以使用点数组的Collection。每次用户单击“绘制”按钮时,您都会向集合中添加一个新数组,并使该新数组成为 active 数组。在您的mouseClicked 中,您可以将用户单击的点添加到活动点数组中,当您绘制组件时,而不是仅仅绘制一个之字形,遍历数组集合并将它们全部绘制出来。

    【讨论】:

    • 好的,我创建了一个 ArrayList 并按照您编写的步骤进行操作,并且成功了。但是,当我按下“绘图”按钮时,之前的绘图在屏幕上丢失了。我是这样做的: if(e.getSource() == draw){ Point[] newZigzag = new Point[200]; (drawing.getMyArrayList()).add(newZigzag);绘图.setActiveArray(newZigzag);绘图.setAbleToDraw(true); }
    • 你在repaint做什么?
    • 好吧,我把它整理出来了,现在可以正常工作了。感谢您的帮助。
    【解决方案2】:

    闻起来像作业。

    当用户停止绘图时,您并没有清除数组。当他们单击新图形的第一个点时,旧图形的最后一个点仍位于数组的末尾,因此您的绘制函数会忠实地在它们之间绘制一条线。如果你在他们停止绘制时清除数组,它的行为应该是你想要的。

    【讨论】:

    • 这是一个大项目,这只是其中的一小部分 :) 嗯,你是对的。我不清除数组,但是当我这样做时,它不会再画线并抛出空指针异常对吗?
    • 可以通过在取消引用之前检查数组是否为空来避免 NPE。其他线条是否会消失取决于您的绘图是累积的还是空白的。 @nineside 的答案是更好(虽然更复杂)的解决方案。
    猜你喜欢
    • 2013-11-20
    • 2016-04-12
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多