Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengelakkan Pembekuan GUI Semasa Memuatkan Imej dalam Swing?

Bagaimana untuk Mengelakkan Pembekuan GUI Semasa Memuatkan Imej dalam Swing?

Susan Sarandon
Susan Sarandonasal
2024-11-10 03:33:02404semak imbas

How to Avoid GUI Freezing While Loading Images in Swing?

Paparkan Imej Menggunakan SwingWorker

Masalah: Membekukan GUI Semasa Memuatkan Imej

Apabila imej dimuatkan dari web ke panel, GUI boleh beku sehingga proses pemuatan selesai. Ini boleh menjengkelkan pengguna.

Penyelesaian: Menggunakan SwingWorker

Untuk mengelakkan pembekuan GUI, pertimbangkan untuk menggunakan javax.swing.SwingWorker. Kelas ini membolehkan pemuatan latar belakang imej sambil mengekalkan urutan GUI hidup.

Pelaksanaan

Contoh berikut menunjukkan cara menggunakan SwingWorker untuk memuatkan imej:

import java.awt.*;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public final class WorkerTest extends JFrame {

    private final JLabel label = new JLabel("Loading...");

    public WorkerTest() {
        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(() -> {
            WorkerTest wt = new WorkerTest();
            wt.setVisible(true);
            wt.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");
                WorkerTest.this.pack();
                WorkerTest.this.setLocationRelativeTo(null);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

Dalam ini contoh:

  • Kelas ImageWorker memanjangkan SwingWorker untuk mengendalikan pemuatan dan saiz semula imej.
  • Kaedah doInBackground() yang ditindih memuatkan imej daripada URL dan menskalakannya kepada saiz yang dikehendaki.
  • Kaedah yang ditindih done() mengemas kini ikon label dan teks apabila pemuatan imej selesai, dan mengubah saiz dan meletakkan semula bingkai dengan sewajarnya.
  • btn_TrackbusActionPerformed kaedah dalam kod yang disediakan boleh diubah suai untuk memanggil kaedah mula() apabila butang diklik, memulakan proses pemuatan imej di latar belakang.

Dengan menggunakan SwingWorker, proses pemuatan imej boleh dijalankan di latar belakang, membenarkan GUI kekal responsif semasa imej sedang diambil dan dipaparkan.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Pembekuan GUI Semasa Memuatkan Imej dalam Swing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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