【发布时间】:2014-04-12 13:36:05
【问题描述】:
我已经实现了这个算法,它使用鼠标点击创建一个形状,然后你可以使用边界填充算法用颜色填充形状......只有部分形状被填充,然后我得到这个错误: 线程“AWT-EventQueue-0”中的异常 java.lang.StackOverflowError 在 java.util.HashMap.getEntry(未知来源) 在 java.util.HashMap.get(未知来源) 在 sun.awt.AppContext.get(未知来源) 在 com.sun.java.swing.SwingUtilities3.getDelegateRepaintManager(未知来源) 在 javax.swing.RepaintManager.getDelegate(未知来源) 在 javax.swing.RepaintManager.addDirtyRegion(未知来源) 在 javax.swing.JComponent.repaint(未知来源) 在 java.awt.Component.repaint(Unknown Source)
知道有什么问题吗?这是我使用的边界填充算法......
public void BoundaryFill(int x, int y, Color bColor, Color fColor){
int current = bI.getRGB(x, y);
if((current != bColor.getRGB()) && (current != fColor.getRGB())){
//bI.setRGB(x, y, fColor.getRGB());
bI.setRGB(x, y, fColor.getRGB());
repaint();
BoundaryFill(x+1, y, bColor, fColor);
BoundaryFill(x-1, y, bColor, fColor);
BoundaryFill(x, y-1, bColor, fColor);
BoundaryFill(x, y+1, bColor, fColor);
}
else
return;
}
注意x和y参数是鼠标点击和填充发生的坐标....
【问题讨论】:
-
为什么不改用
Graphics2D#fill(Shape s)? -
我只能使用这个算法:(
-
我已经包含了图片....
-
该方法被一个点调用,这导致该方法被其邻居调用,这导致该方法被其邻居调用,等等。鉴于要更新的点数很大,以及为每个点执行的大量操作(repaint()),我并不惊讶你达到了堆栈的限制。不要使用递归。使用迭代。
标签: java swing algorithm graphics stack-overflow