Вам необходимо создать свой графический интерфейс в потоке диспетчеризации событий (EDT) .
Приложение 1: Вот полный пример.
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Imager {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ImagePanel("P1010013.JPG"));
frame.pack();
frame.setVisible(true);
}
});
}
private static class ImagePanel extends JPanel {
BufferedImage img;
ImagePanel(String name) {
super(true);
try {
img = ImageIO.read(new File(name));
this.setPreferredSize(new Dimension(
img.getWidth(), img.getHeight()));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), null);
}
}
}
Кроме того, Эш прав насчет масштабирования. Попробуйте g.drawImage(img, 0, 0, null);
вместо.
Приложение 2: Вы можете определить, рисуете ли вы на EDT , используя isEventDispatchThread()
.
Приложение 3: Я расширил пример выше.
Приложение 4: Как Эш отмечает : «Если вы не соблюдаете непрозрачное свойство, вы, вероятно, увидите визуальные артефакты».