Вероятно, это проблема параллелизма Swing.Но что более важно, вы никогда не должны никогда загружать изображение из метода paint или paintComponent.Прочитайте его в конструкторе или в другом месте, но paint / paintComponent должен быть скудным и невероятно быстрым.
Чтобы решить вашу проблему, рассмотрите возможность чтения на изображении в объекте SwingWorker.Однако если вы вызываете JOptionPane из метода doInBackground SwingWorker, обязательно вызовите его в потоке событий Swing, EDT, используя SwingUtilities.invokeLater (Runnable).
Кроме того, вы вряд ли когда-нибудь захотите нарисоватьв методе рисования JPanel, если вы не заботитесь о рисовании границ и детей.Вместо этого рисуйте в методе paintComponent и не забудьте вызвать метод super.paintComponent (g) в этом переопределении paintComponent.Возможно, вы захотите прочитать учебные пособия по Swing, поскольку все это прописано.
Например:
import java.awt.Graphics;
import java.awt.Image;
import java.io.InputStream;
import java.util.concurrent.ExecutionException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class MyBoardPannel extends JPanel {
protected static final String SAMPLE_IMAGE = "sampleImage";
Image imageToShow = null;
public MyBoardPannel() {
SwingWorker<Image, Void> mySW = new SwingWorker<Image, Void>() {
@Override
protected Image doInBackground() throws Exception {
return loadImage(SAMPLE_IMAGE);
}
@Override
protected void done() {
try {
imageToShow = get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
mySW.execute();
}
@Override
public void paintComponent(Graphics grahics) {
super.paintComponent(grahics);
if (imageToShow != null) {
grahics.drawImage(imageToShow, 0, 0, null);
}
}
private Image loadImage(String imageName) {
InputStream imageStream = getClass().getResourceAsStream(
"/" + imageName + ".png");
try {
return ImageIO.read(imageStream);
} catch (Exception e) {
final String errorMessage = "Failed to load image " + imageName;
System.err.println(errorMessage);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(MyBoardPannel.this, errorMessage,
"Image loading error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
});
}
return null;
}
}