Table of Contents
How to Display an Image Without Freezing the GUI
Problem
Cause
Solution: Using SwingWorker
Implementation
Home Java javaTutorial How to Display an Image Without Freezing the GUI Using SwingWorker?

How to Display an Image Without Freezing the GUI Using SwingWorker?

Nov 12, 2024 pm 12:09 PM

How to Display an Image Without Freezing the GUI Using SwingWorker?

How to Display an Image Without Freezing the GUI

Problem

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.

Cause

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.

Solution: Using SwingWorker

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.

Implementation

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

In this code:

  1. A label is used to display the image.
  2. The start() method is called to initiate the image loading process.
  3. The ImageWorker class extends SwingWorker and defines the doInBackground() method that loads the image in a separate thread.
  4. The done() method is called when the image loading is complete. It sets the image as the icon for the label and updates the GUI.

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!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Have Crossplay?
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)