I have a task executioner that has 5 outer panels, and each outer panel is a JFrame that has an innerPanel. The innerpanel is a JPanel responsible for painting an image. I'm displaying and removing many images, over and over, and I'm having very poor performance. 
Can someone suggest a way to load and remove many images without using a JFrame?
I am displaying the images on different parts of the screen, and sometimes for extremely short durations 50-1500ms. Sometimes the images only partially loads and on others it does not load at all.
Main
public class Main {
    public static void main(String[] args) {
        new Main();
    }
    public Main() {
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleWithFixedDelay(new ImageTask(new OuterPanel(ScreenPosition.CENTER)), 0, 3, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleWithFixedDelay(new ImageTask(new OuterPanel(ScreenPosition.CENTER)), 0, 3, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleWithFixedDelay(new ImageTask(new OuterPanel(ScreenPosition.CENTER)), 0, 3, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleWithFixedDelay(new ImageTask(new OuterPanel(ScreenPosition.CENTER)), 0, 3, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleWithFixedDelay(new ImageTask(new OuterPanel(ScreenPosition.CENTER)), 0, 3, TimeUnit.SECONDS);
    }
}
ImageTask
public class ImageTask implements Runnable {
    private OuterPanel outerPanel;
    private int messageIndex;
    public ImageTask(OuterPanel outerPanel) {
        this.outerPanel = outerPanel;
    }
    @Override
    public void run() {
        outerPanel.setMessage(imagePath);
        outerPanel.setVisible(true);
        try {
            TimeUnit.MILLISECONDS.sleep(150);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        outerPanel.setVisible(false);
    }
}
OuterPanel
public class OuterPanel extends JFrame {
    private InnerPanel innerPanel;
    public static int height = 200;
    public static int width = 200;
    public OuterPanel(ScreenPosition screenPosition) {
        initComponents();
        setFocusable(false);
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        setAlwaysOnTop(true);
        setSize(SetScreenLocation.screenSize.width, SetScreenLocation.screenSize.height);
        setFocusableWindowState(false);
        setEnabled(false);
        pack();
        setLocation(0, 0);
    }
    private void initComponents() {
        innerPanel = new InnerPanel();
        add(innerPanel);
    }
    public void setMessage(Message message) {
        ImageIcon icon = IconFetch.getInstance().getIcon(message.getImagePath());
        if (icon != null) {
            Image img = IconFetch.getInstance().getScaledImage(icon.getImage(), width, height);
            innerPanel.setImage(img);
        }
    }
}
InnerPanel
public class InnerPanel extends JPanel {
    private String message;
    private Image img;
    public InnerPanel() {
        setOpaque(false);
        setPreferredSize(new Dimension(900, 450));
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        if (img != null) {
            x = (this.getWidth() - img.getWidth(null)) / 2;
            y = (this.getHeight() - img.getHeight(null)) / 2;
            g2d.drawImage(img, x, y, this);
        }
    }
    public void setImage(Image image) {
        this.img = image;
        repaint();
    }
}
 
    