Вы должны переопределить paintComponent(Graphics g)
и нарисовать изображение там. В этом случае вы должны сделать это для компонента JPanel
(я думаю? Если нет, то сделать это для JComponent
(s), на которые вы ссылаетесь). Кроме того, поскольку Swing не является потокобезопасным, убедитесь, что эти изменения выполнены в EDT
.
Пример
public class Demo{
private static BufferedImage bi;
public static void main(String[] args){
try{
loadImage();
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createAndShowGUI();
}
});
}
catch (IOException e){
// handle exception
}
}
private static void loadImage() throws IOException{
bi = ImageIO.read(new File("src/resource/braveheart.PNG"));
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
Graphics g2 = g.create();
g2.drawImage(bi, 0, 0, getWidth(), getHeight(), null);
g2.dispose();
}
@Override
public Dimension getPreferredSize(){
return new Dimension(bi.getWidth(), bi.getHeight());
}
};
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
OUTPUT
Важно помнить, что в этом примере игнорируются подсказки при рендеринге, поэтому при максимизации JFrame
качество изображения будет очень плохим. :)
EDIT
Отвечая на этот вопрос, я предположил, что у вас есть базовое понимание свинга. Я полагаю, я взял на себя слишком много. Важно отметить, что все компоненты должны быть добавлены в контейнер верхнего уровня до того, как он будет реализован (то есть сделан видимым). Это гарантирует, что все отображается без изменения размера вашего кадра. Как и предполагали другие, вы могли бы просто использовать JLabel
для рендеринга изображения, а затем добавить его в JPanel
. Вместо этого я продвинул заказную живопись, которая совершенно приемлема, и для меня, более чистая.