Yes, that's right. An ImageIcon contains an Image; a BufferedImage is-a Image. But if your image is to be loaded from a file, first load it using ImageIO#read(...) and construct the ImageIcon with the image as argument. An ImageIcon constructed with a
String path to the file loads the image using java.awt.Toolkit, which caches the image as a result of which updates/changes/edits may not be reflected.
After making any changes to (aka editing) the BufferedImage, you *will* need to repaint() the JLabel that displays the Icon.