Rumah > Java > javaTutorial > Bagaimana untuk Memaparkan Imej Tanpa Membekukan GUI Menggunakan SwingWorker?

Bagaimana untuk Memaparkan Imej Tanpa Membekukan GUI Menggunakan SwingWorker?

Barbara Streisand
Lepaskan: 2024-11-12 12:09:02
asal
1140 orang telah melayarinya

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

Cara Memaparkan Imej Tanpa Membekukan GUI

Masalah

Apabila butang diklik, imej dimuatkan dari web dan dipaparkan dalam panel dalam JFrame lain. Walau bagaimanapun, ini menyebabkan tetingkap aplikasi menjadi beku seketika semasa proses pemuatan imej.

Punca

Isu timbul kerana pertanyaan butang dilaksanakan pada utas penghantaran acara (EDT). Urutan ini bertanggungjawab untuk mengendalikan semua kemas kini GUI, jadi apabila ia disekat, aplikasi menjadi tidak responsif.

Penyelesaian: Menggunakan SwingWorker

Untuk mengelakkan pembekuan, imej harus dimuatkan di latar belakang sementara GUI kekal responsif. Ini boleh dicapai menggunakan kelas javax.swing.SwingWorker.

SwingWorker ialah kelas selamat benang yang membenarkan pelaksanaan tugas di latar belakang tanpa menyekat EDT. Ia menyediakan kaedah untuk menetapkan tugasan untuk dilaksanakan dan kemudian melaksanakannya dalam urutan yang berasingan.

Pelaksanaan

Berikut ialah contoh cara menggunakan SwingWorker untuk memaparkan imej tanpa membekukan 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();
            }
        }
    }
}
Salin selepas log masuk

Dalam kod ini:

  1. Label digunakan untuk memaparkan imej.
  2. Kaedah mula() dipanggil untuk memulakan proses pemuatan imej.
  3. Kelas ImageWorker memanjangkan SwingWorker dan mentakrifkan kaedah doInBackground() yang memuatkan imej dalam urutan berasingan.
  4. Kaedah done() dipanggil apabila pemuatan imej selesai. Ia menetapkan imej sebagai ikon untuk label dan mengemas kini GUI.

Atas ialah kandungan terperinci Bagaimana untuk Memaparkan Imej Tanpa Membekukan GUI Menggunakan SwingWorker?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan