ImageIcon 方法无限循环
ImageIcon method loops infinitely
我正在开发一个 Java swing 应用程序,我试图在其中加载国际象棋棋子的图像,并且一切正常,直到突然出现错误:
Exception in thread "main" java.lang.WhosebugError
at java.base/java.lang.String.indexOf(String.java:1612)
at java.base/java.lang.String.indexOf(String.java:1569)
at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:151)
at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
at java.base/java.net.URL.<init>(URL.java:696)
at java.base/java.net.URL.<init>(URL.java:563)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1222)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.findResource(URLClassPath.java:1211)
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:294)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResourceOnClassPath(BuiltinClassLoader.java:499)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResource(BuiltinClassLoader.java:323)
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1400)
at java.base/java.lang.Class.getResource(Class.java:2741)
at model.Board.getImageIcon(Board.java:246)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
并且 at model.Board.setBoard(Board.java:49)
中的部分在之后被记录了很多次(只有那部分)。
调试报错的时候看到一直在同一个方法中反复进入,直到发生Stack overflow错误。在那里,我正在从本地地址检索图像。(以前都有效。)
方法如下:
private ImageIcon getImageIcon(String path,String description) {
URL imgURL = getClass().getResource(path);
if (imgURL != null) {
Image ii=new ImageIcon(imgURL, description).getImage().getScaledInstance(70, 70, Image.SCALE_SMOOTH);
ImageIcon im=new ImageIcon(ii);
return im;
}
else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
这里叫它
public void setBoard(Color c1,Color c2,Dimension dim) {
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
Point point=new Point(i,j);
if ((i+j)%2==0) {
if(i==0 && j==0) {
***Figure f=new Figure (null,null,"white_rook",null,getImageIcon("/images/WhiteRook.png",null));***
fields[i][j]=new Field(c1,new Position(point.x,point.y),i*8+j,f);
f.field=fields[i][j];
f.pos=new Position(point.x,point.y);
fields[i][j].add(f);
figures[i][j]=f;
}
这是方法 setBoard 的一部分,它基本上将每个棋子放在场上。图class看起来像:
public class Figure extends JPanel {
public Field field;
public Color color;
public String name;
public Movement movement;
public ImageIcon imageIcon;
public Position pos;
public Figure(Field field, Color color, String name, Movement movement, ImageIcon icon) {
this.field = field;
this.color = color;
this.name = name;
this.movement = movement;
this.imageIcon = icon;
this.setPreferredSize(new Dimension(70, 70));
this.addMouseMotionListener(new FigureAction());
this.addMouseListener(new FigureAction());
this.setBackground(null);
}
}
我在这里从 png 图像制作缩放的 imageIcon 并将其取回。如果有人能够告诉我可能是什么问题,我将不胜感激。我想我在这里遗漏了一些重要的东西,但目前不知道还有什么地方可以看。提前致谢。
根据您提供的堆栈跟踪和代码:
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
这意味着:
Figure
构造函数被调用。
- 然后调用
FigureAction
构造函数。
- 然后,在之后的某个时刻,
Board.setBoard
被调用。
- 但是
Board.setBoard
在您刚刚用 3 个星号突出显示的行中再次调用 Figure
构造函数...
为了解决这个问题,这取决于你想要达到的目标。这意味着如果您希望我们尝试解决它,我们需要更多代码才能看到(例如 MRE)。
第一个 getClass()
实际上可能是 child class,所以为了良好的顺序:
URL imgURL = Board.class.getResource(path);
然后,优化内存使用和速度。我忽略这里的描述。
Map<String, ImageIcon> sharedIcons = new HashMap<>();
private ImageIcon getImageIcon(String path, String description) {
ImageIcon icon = sharedIcons.get(path);
if (icon == null) {
URL imgURL = getClass().getResource(path);
if (imgURL == null) {
System.err.println("Couldn't find file: " + path);
return null;
}
icon = new ImageIcon(imgURL, description);
Image ii = new ImageIcon(imgURL, description)
.getImage().getScaledInstance(70, 70, Image.SCALE_SMOOTH);
icon = new ImageIcon(ii);
sharedIcons.put(path, icon);
}
return icon;
}
没有递归的检查。 FigureAction
呼叫 setBoard
左右。
我正在开发一个 Java swing 应用程序,我试图在其中加载国际象棋棋子的图像,并且一切正常,直到突然出现错误:
Exception in thread "main" java.lang.WhosebugError
at java.base/java.lang.String.indexOf(String.java:1612)
at java.base/java.lang.String.indexOf(String.java:1569)
at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:151)
at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
at java.base/java.net.URL.<init>(URL.java:696)
at java.base/java.net.URL.<init>(URL.java:563)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1222)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.findResource(URLClassPath.java:1211)
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:294)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResourceOnClassPath(BuiltinClassLoader.java:499)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResource(BuiltinClassLoader.java:323)
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1400)
at java.base/java.lang.Class.getResource(Class.java:2741)
at model.Board.getImageIcon(Board.java:246)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
并且 at model.Board.setBoard(Board.java:49)
中的部分在之后被记录了很多次(只有那部分)。
调试报错的时候看到一直在同一个方法中反复进入,直到发生Stack overflow错误。在那里,我正在从本地地址检索图像。(以前都有效。)
方法如下:
private ImageIcon getImageIcon(String path,String description) {
URL imgURL = getClass().getResource(path);
if (imgURL != null) {
Image ii=new ImageIcon(imgURL, description).getImage().getScaledInstance(70, 70, Image.SCALE_SMOOTH);
ImageIcon im=new ImageIcon(ii);
return im;
}
else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
这里叫它
public void setBoard(Color c1,Color c2,Dimension dim) {
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
Point point=new Point(i,j);
if ((i+j)%2==0) {
if(i==0 && j==0) {
***Figure f=new Figure (null,null,"white_rook",null,getImageIcon("/images/WhiteRook.png",null));***
fields[i][j]=new Field(c1,new Position(point.x,point.y),i*8+j,f);
f.field=fields[i][j];
f.pos=new Position(point.x,point.y);
fields[i][j].add(f);
figures[i][j]=f;
}
这是方法 setBoard 的一部分,它基本上将每个棋子放在场上。图class看起来像:
public class Figure extends JPanel {
public Field field;
public Color color;
public String name;
public Movement movement;
public ImageIcon imageIcon;
public Position pos;
public Figure(Field field, Color color, String name, Movement movement, ImageIcon icon) {
this.field = field;
this.color = color;
this.name = name;
this.movement = movement;
this.imageIcon = icon;
this.setPreferredSize(new Dimension(70, 70));
this.addMouseMotionListener(new FigureAction());
this.addMouseListener(new FigureAction());
this.setBackground(null);
}
}
我在这里从 png 图像制作缩放的 imageIcon 并将其取回。如果有人能够告诉我可能是什么问题,我将不胜感激。我想我在这里遗漏了一些重要的东西,但目前不知道还有什么地方可以看。提前致谢。
根据您提供的堆栈跟踪和代码:
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
这意味着:
Figure
构造函数被调用。- 然后调用
FigureAction
构造函数。 - 然后,在之后的某个时刻,
Board.setBoard
被调用。 - 但是
Board.setBoard
在您刚刚用 3 个星号突出显示的行中再次调用Figure
构造函数...
为了解决这个问题,这取决于你想要达到的目标。这意味着如果您希望我们尝试解决它,我们需要更多代码才能看到(例如 MRE)。
第一个 getClass()
实际上可能是 child class,所以为了良好的顺序:
URL imgURL = Board.class.getResource(path);
然后,优化内存使用和速度。我忽略这里的描述。
Map<String, ImageIcon> sharedIcons = new HashMap<>();
private ImageIcon getImageIcon(String path, String description) {
ImageIcon icon = sharedIcons.get(path);
if (icon == null) {
URL imgURL = getClass().getResource(path);
if (imgURL == null) {
System.err.println("Couldn't find file: " + path);
return null;
}
icon = new ImageIcon(imgURL, description);
Image ii = new ImageIcon(imgURL, description)
.getImage().getScaledInstance(70, 70, Image.SCALE_SMOOTH);
icon = new ImageIcon(ii);
sharedIcons.put(path, icon);
}
return icon;
}
没有递归的检查。 FigureAction
呼叫 setBoard
左右。