Вы должны переопределить paintComponent(Graphics g)
и нарисуйте в нем изображение. В этом случае вы должны сделать это для компонента JPanel
(я думаю? Если нет, сделайте это для JComponent
(ов), о которых вы говорите). Кроме того, поскольку 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);
}
}
ВЫВОД
![введите здесь описание изображения](https://i.stack.imgur.com/8bXgn.png)
Важно иметь в виду, что в этом примере игнорируются подсказки по рендерингу, поэтому, когда вы максимизируете JFrame
, качество изображения будет очень плохим. :)
ИЗМЕНИТЬ
Отвечая на этот вопрос, я предполагал, что вы имеете базовое представление о Swing. Полагаю, я слишком много предполагал. Важно отметить, что все компоненты должны быть добавлены в контейнер верхнего уровня до того, как он будет реализован (т. е. сделан видимым). Это гарантирует, что все будет отображаться без необходимости изменять размер кадра. Как и предполагали другие, вы могли бы просто использовать JLabel
для рендеринга изображения, а затем добавить его в свой JPanel
. Вместо этого я продвигал нестандартную живопись, что вполне приемлемо и, на мой взгляд, чище.
person
mre
schedule
06.07.2011
paint(...)
или переопределять его. - person mre   schedule 06.07.2011