The default layout of JFrame is BorderLayout. When you use code frame.add(imageLabel); , the imageLabel is added to center. And when you write again frame.add(label); the label is added on the imageLabel. Therefore imageLabel is hidden from the label.
And remember that, when you set, setOpaque(false), the component makes no guarantees about painting all the bits within its rectangular bounds. And this is not saying that "it will definitely not paint all the bits". Though we that property false, there are instances where all the bits are painted..