Попытка создать подвижный объект с помощью JPanel, у которого есть ImageIcon, который автоматически растягивается при изменении его размера. Теперь, когда я запускаю приложение, оно правильно активируется и показывает изображение. Однако, когда я нажимаю кнопку, появляется следующее сообщение об ошибке:
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)
Обнаружили, что это может быть король косвенной рекурсии? вещь, но я просто не могу найти, что вызывает это. Ниже приведен класс GridPanel, который я написал для JPanel.
package tutorial;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import darrylbu.icon.StretchIcon;
public class GridPanel extends JPanel
{
private BufferedImage image;
GridPanel() {}
GridPanel(String path)
{
setLayout(null);
try
{
image = ImageIO.read(new File(path));
}catch(IOException e)
{
System.out.println(e);
}
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar());
move(10, 10);
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
StretchIcon icon = new StretchIcon(image);
icon.paintIcon(this, g, 0, 0);
}
public void move(int x, int y)
{
super.setLocation(getX() + x, getY() + y);
}
}
@MadProgrammer Никогда не обнаруживал, что я переопределяю метод move
. Большое спасибо. Что касается StretchIcon
, значит ли это, что я должен объявить что-то вроде private StretchIcon s
в классе?
Это будет хорошим началом. Однако реальный ответ будет сильно зависеть от того, чего вы пытаетесь достичь.
Здесь:
public void setLocation(int x, int y)
{
move (x, y);
}
Это исходный код для Компонент.setLocation(). Как видите, этот метод вызывает move()
. Ваша панель переопределяет move()
вызов setLocation()
. Вот и все: ваша рекурсия не "косвенная", она прямо здесь.
Итак, очевидно: не вызывайте setLocation()
из вашего move()
метода! Так что весь ваш подход ошибочен на данный момент.
Спасибо, что сказали мне, что я переопределяю функцию move
. Никогда не находил этого, и это решило все LOL.
setLocation
звонитmove
, который снова звонит вамmove
, потому что вы его переопределили... кстати. Я бы избегал делать это таким образом. Начнем с того, что нет необходимости создавать новыйStretchIcon
каждый раз, когда вызываетсяpaintComponent
. Вы также можете изменить положение экземпляраicon
на панели в зависимости от того, какое местоположение вы предпочитаете, а не пытаться изменить местоположение самой панели, что может иметь ряд нежелательных побочных эффектов.