When a button is clicked, an image is loaded from the web and displayed in a panel within another JFrame. However, this causes the application window to freeze momentarily during the image loading process.
The issue arises because the button's query is executed on the event dispatch thread (EDT). This thread is responsible for handling all GUI updates, so when it's blocked, the application becomes unresponsive.
To avoid the freezing, the image should be loaded in the background while the GUI remains responsive. This can be achieved using the javax.swing.SwingWorker class.
SwingWorker is a thread-safe class that allows for the execution of tasks in the background without blocking the EDT. It provides methods for setting the task to be executed and then executing it in a separate thread.
Here's an example of how to use SwingWorker to display an image without freezing the GUI:
import java.util.concurrent.ExecutionException; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.net.URL; public class ImageDisplaySwingWorker extends JFrame { private JLabel label = new JLabel("Loading..."); public ImageDisplaySwingWorker() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); this.add(label); this.pack(); this.setLocationRelativeTo(null); } private void start() { new ImageWorker().execute(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ImageDisplaySwingWorker imageDisplaySwingWorker = new ImageDisplaySwingWorker(); imageDisplaySwingWorker.setVisible(true); imageDisplaySwingWorker.start(); } }); } class ImageWorker extends SwingWorker<Image, Void> { private static final String TEST = "http://cdn.sstatic.net/stackexchange/img/logos/so/so-logo.png"; @Override protected Image doInBackground() throws IOException { Image image = ImageIO.read(new URL(TEST)); return image.getScaledInstance(640, -1, Image.SCALE_SMOOTH); } @Override protected void done() { try { ImageIcon icon = new ImageIcon(get()); label.setIcon(icon); label.setText("Done"); ImageDisplaySwingWorker.this.pack(); ImageDisplaySwingWorker.this.setLocationRelativeTo(null); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } }
In this code:
The above is the detailed content of How to Display an Image Without Freezing the GUI Using SwingWorker?. For more information, please follow other related articles on the PHP Chinese website!