Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPanel.setLocation时发生堆栈溢出错误,其中包含StretchIcon(ImageIcon)_Java_Swing - Fatal编程技术网

Java 使用JPanel.setLocation时发生堆栈溢出错误,其中包含StretchIcon(ImageIcon)

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

尝试用JPanel制作一个可移动的对象,它有一个图像图标,当我调整它的大小时,它会自动拉伸。 现在,当我运行应用程序时,它会正确激活并显示图像。 但是,当我按下按钮时,会显示以下错误消息:

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
函数。从未发现,它解决了所有问题。谢谢你告诉我,我正在覆盖
移动
函数。从来没有发现过,它解决了一切,哈哈。