Тьфу ... так много проблем в этом (коротком) единственном методе:
public void paint(Graphics g) {
try {
img = ImageIO.read(new File("pic.jpg"));
g.drawImage(img, 50, 50, this);
} catch (IOException e) {
}
}
- Правильный метод для переопределения для любого
JComponent
(или его расширения как в JPanel
)is paintComponent(Graphics)
. - Любой переопределенный метод рисования должен немедленно вызвать супер метод, чтобы гарантировать, что BG и границы окрашены, поэтому стираются все ранее окрашенные элементы.
- Чтение изображения никогда не должно бытьвыполняется методом рисования, который предназначен только для рисования , а не для выполнения каких-либо «длительных» задач, таких как загрузка изображения.Переместите этот код в конструктор или метод
Generate
(который, кстати, должен быть в нижнем регистре с первой буквой, т.е. IE generate
) - Ресурсы приложения (например, изображение, которое, как я предполагаю, являетсянеотъемлемая часть приложения.) станет встроенным ресурсом к моменту развертывания, поэтому имеет смысл начать доступ к ним, как если бы они были, прямо сейчас. внедренный ресурс должен быть доступен по URL, а не по файлу.Смотрите информацию.страница для встроенного ресурса о том, как сформировать URL.
} catch (IOException e) { }
Кто-то выше сказал, что это кажется «глупым» - потому что это так.Код игнорирует или отбрасывает эти очень удобные трассировки стека, которые могут помочь объяснить непосредственную и наиболее актуальную проблему.Измените его на } catch (IOException e) { e.printStackTrace(); }
для получения дополнительной информации.
Редактировать
Я только что заметил что-то еще, что может быть "не пошло" для этого кода.Метод Generate
- это единственное, что вызывается из метода main
.Ни при каких условиях он не создает Meme
и не добавляет его в кадр!Что, черт возьми, вы ожидали, что появится в кадре?
Редактировать 2
Переделанный выше код переработан, чтобы включить приведенные выше предложения, а также еще пару. Не устраняет все потенциальные проблемы или включает все возможные оптимизации.
Это результат:
![enter image description here](https://i.stack.imgur.com/6eTbo.png)
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Meme extends JPanel {
public BufferedImage img;
Meme() {
/* This next statement is purely for debugging. If the GUI is not red
inside the frame decorations, something is very wrong. */
setBackground(Color.RED);
try {
//img = ImageIO.read(new File("pic.jpg"));
img = ImageIO.read(new URL("https://i.stack.imgur.com/7bI1Y.jpg"));
generate();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Meme();
}
public void generate() {
//Creating the frame
JFrame mainframe = new JFrame("Meme");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.add(this);
mainframe.setSize(600, 500);
mainframe.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 50, 50, this);
}
}