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();
}
}