Я немного переделал твой код песочницы Swing. Вот то, что я придумал.
Изображение искажено, потому что я сделал его подходящим для панели рисования 400 x 400. Вы должны уменьшить изображение и сохранить соотношение сторон.
Вот изменения, которые я сделал.
Я добавил вызов метода invingLater SwingUtilities, чтобы поместить компоненты Swing в потоке рассылки событий.
Я сделал чертежную панель классом, чтобы установить желаемый размер. Вы устанавливаете размер панели рисования, а не JFrame. Кого волнует, насколько большой или маленький JFrame?
Я помещаю вызовы метода JFrame в правильном порядке.
И вот код.
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class SwingSandbox implements Runnable {
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new SwingSandbox());
}
private BufferedImage image;
public SwingSandbox() {
try {
image = ImageIO.read(new File("C:\\Users\\Owner\\OneDrive\\Pictures\\Saved Pictures\\StockMarketGame.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
JFrame frame = new JFrame("Image Display");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
DrawingPanel panel = new DrawingPanel(image);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;
public DrawingPanel(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, 400, 400, null);
}
}
}