Java 使用JPanel.setLocation时发生堆栈溢出错误,其中包含StretchIcon(ImageIcon)
尝试用JPanel制作一个可移动的对象,它有一个图像图标,当我调整它的大小时,它会自动拉伸。 现在,当我运行应用程序时,它会正确激活并显示图像。 但是,当我按下按钮时,会显示以下错误消息:Java 使用JPanel.setLocation时发生堆栈溢出错误,其中包含StretchIcon(ImageIcon),java,swing,Java,Swing,尝试用JPanel制作一个可移动的对象,它有一个图像图标,当我调整它的大小时,它会自动拉伸。 现在,当我运行应用程序时,它会正确激活并显示图像。 但是,当我按下按钮时,会显示以下错误消息: Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at java.awt.Component.setLocation(Unknown Source) at tutorial.GridPanel.move(Gr
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.awt.Component.setLocation(Unknown Source)
at tutorial.GridPanel.move(GridPanel.java:51)
at java.awt.Component.setLocation(Unknown Source)
at tutorial.GridPanel.move(GridPanel.java:51)
at java.awt.Component.setLocation(Unknown Source)
at tutorial.GridPanel.move(GridPanel.java:51)
(continue many times)
发现它可能是间接递归之王?但我就是找不到原因。下面是我为JPanel编写的GridPanel类
软件包教程;
导入java.awt.Graphics;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JPanel;
导入darrylbu.icon.StretchIcon;
公共类GridPanel扩展了JPanel
{
私有缓冲图像;
GridPanel(){}
GridPanel(字符串路径)
{
setLayout(空);
尝试
{
image=ImageIO.read(新文件(路径));
}捕获(IOE异常)
{
系统输出打印ln(e);
}
addKeyListener(新的KeyAdapter()
{
按下公共无效键(按键事件e)
{
System.out.println(e.getKeyChar());
移动(10,10);
}
});
}
@凌驾
受保护组件(图形g){
超级组件(g);
StretchIcon图标=新的StretchIcon(图像);
icon.paintIcon(这个,g,0,0);
}
公共无效移动(整数x,整数y)
{
super.setLocation(getX()+x,getY()+y);
}
}
此处:
public void setLocation(int x, int y)
{
move (x, y);
}
这是.setLocation()的源代码。如您所见:该方法调用move()
。您可以使用面板覆盖move()
来调用setLocation()
。好了:你的递归不是“间接的”,它就在那里
显然:不要从move()
方法调用setLocation()
!因此,您的整个方法在这一点上是有缺陷的。这里:
这是.setLocation()的源代码。如您所见:该方法调用move()
。您可以使用面板覆盖move()
来调用setLocation()
。好了:你的递归不是“间接的”,它就在那里
显然:不要从
move()
方法调用setLocation()
!因此,您的整个方法在这一点上是有缺陷的。setLocation
调用move
,它再次调用您move
,因为您已经覆盖了它。。。旁注。我会避免这样做。首先,无需每次调用paintComponent
时都创建一个新的StretchIcon
。您还可以根据您喜欢的位置在面板中重新定位图标的实例,而不是试图更改面板本身的位置,这可能有许多不需要的方面effects@MadProgrammer从未发现我正在重写move
方法。非常感谢。关于StretchIcon
这件事,这是否意味着我应该在课堂上发表类似private StretchIcon s
的言论?这将是一个好的开始。然而,真正的答案将在很大程度上取决于您试图实现的是什么setLocation
调用move
,它再次调用您move
,因为您已经覆盖了它。。。旁注。我会避免这样做。首先,无需每次调用paintComponent
时都创建一个新的StretchIcon
。您还可以根据您喜欢的位置在面板中重新定位图标的实例,而不是试图更改面板本身的位置,这可能有许多不需要的方面effects@MadProgrammer从未发现我正在重写move
方法。非常感谢。关于StretchIcon
这件事,这是否意味着我应该在课堂上发表类似private StretchIcon s
的言论?这将是一个好的开始。然而,真正的答案在很大程度上取决于您试图实现的目标。请您告诉我我正在覆盖move
函数。从未发现,它解决了所有问题。谢谢你告诉我,我正在覆盖移动
函数。从来没有发现过,它解决了一切,哈哈。