Java

Не выводит изображение в JAVA

Чайник, начал недавно изучать JAVA, не могу понять, почему не выводит изображение на экран. Вот код:
-------------------------------------------------------
package img;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

class One extends JComponent{
public Image image;
One(){}
public void paintComponent(Graphics g){

File file = new File("abc.jpg");
try {
image = ImageIO.read(file);
} catch (IOException ex) {
Logger.getLogger(One.class.getName()).log(Level.SEVERE, null, ex);
}
g.drawImage(image, 0, 0, null);
}
}
public class IMG extends JFrame {
IMG(){
JFrame frame = new JFrame();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JLayeredPane lp = getLayeredPane();
One one = new One();
lp.add(one, JLayeredPane.POPUP_LAYER);
setSize(800, 800);
setVisible(true);
}
public static void main(String[] args) {
new IMG();
}

}
------------------------------------------------------
Бутырка Yjdjz
Бутырка Yjdjz
530
Замени это
IMG(){
JFrame frame = new JFrame();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JLayeredPane lp = getLayeredPane();
One one = new One();
lp.add(one, JLayeredPane.POPUP_LAYER);
setSize(800, 800);
setVisible(true);
}

На это

IMG(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(new One());
setSize(800, 800);
setVisible(true);
}

Не знаю, зачем ты вообще JLayeredPane доставал. Просто на сам JFrame ничего добавлено не было, точнее на IMG extends JFrame. А тот JFrame, который ты в первой строчке конструктора создавал я вообще не понял.

Этого достаточно. Работать будет, но предлагаю заменить
g.drawImage(image, 0, 0, null);
На
g.drawImage(image, 0, 0, this);
Так будет лучше. Иногда ImageObserver всё-таки должен быть.
Александр Коваль
Александр Коваль
3 550
Лучший ответ
Бутырка Yjdjz Спасибо большое за ответ. Я забыл в описании добавить - суть для меня была в том, чтобы научиться работать с JPanel(панелями), поэтому и добавил их - "getLayeredPane". Я уже понял ошибку, надо было написать строку - "One.setBounds(размеры). Если не прописать эти размеры, автоматически ставится 0, 0 видимо.
тут пример
https://stackoverflow.com/questions/16998415/drawing-in-jpanel-vs-jcomponent
еще супер метод нужно вызвать
public class Img implements Runnable {
private JFrame frame;
private Image image;
public Img(Image image) {
this.image = image;
}
@Override
public void run() {
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
StaticImageComponent sic = new StaticImageComponent(image);
JLayeredPane lp = frame.getRootPane().getLayeredPane();
lp.add(sic, new Integer(JLayeredPane.POPUP_LAYER));
lp.setSize(sic.getPreferredSize());
frame.setSize(sic.getPreferredSize());
frame.setVisible(true);
}
public static void main(String[] args) {
File file = new File("abc.jpg");
BufferedImage img = null;
try (FileInputStream fis = new FileInputStream(file)) {
img = ImageIO.read(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Img(img));
}
}
public class StaticImageComponent extends JComponent {
final private Image image;
public StaticImageComponent(Image image) {
this.image = image;
setOpaque(true);
int w = image.getWidth(null);
int h = image.getHeight(null);
setBounds(0, 0, w, h);
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}
}