> Java > java지도 시간 > Swing에서 이미지를 로드하는 동안 GUI 정지를 방지하는 방법은 무엇입니까?

Swing에서 이미지를 로드하는 동안 GUI 정지를 방지하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-10 03:33:02
원래의
442명이 탐색했습니다.

How to Avoid GUI Freezing While Loading Images in Swing?

SwingWorker를 사용하여 이미지 표시

문제: 이미지를 로드하는 동안 GUI가 정지됨

이미지가 웹에서 패널로 로드되면 GUI가 로딩 프로세스가 완료될 때까지 정지합니다. 이는 사용자에게 불편을 줄 수 있습니다.

해결책: SwingWorker 사용

GUI 정지를 방지하려면 javax.swing.SwingWorker 사용을 고려하세요. 이 클래스를 사용하면 GUI 스레드를 활성 상태로 유지하면서 이미지를 백그라운드로 로드할 수 있습니다.

구현

다음 예에서는 SwingWorker를 사용하여 이미지를 로드하는 방법을 보여줍니다.

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();
            }
        }
    }
}
로그인 후 복사

여기서 예:

  • ImageWorker 클래스는 SwingWorker를 확장합니다. 이미지 로드 및 크기 조정을 처리합니다.
  • 재정의된 doInBackground() 메서드는 URL에서 이미지를 로드하고 원하는 크기로 크기를 조정합니다.
  • 재정의된 done() 메서드는 라벨의 아이콘을 업데이트합니다. 이미지 로딩이 완료되면 텍스트와 텍스트를 입력하고 이에 따라 프레임의 크기와 위치를 조정합니다.
  • 제공된 코드의 btn_TrackbusActionPerformed 메소드는 버튼 클릭 시 start() 메소드를 호출하여 이미지 로딩을 시작하도록 수정될 수 있습니다.

SwingWorker를 사용하면 이미지 로딩 프로세스가 백그라운드에서 실행될 수 있으므로 이미지를 가져오고 표시하는 동안 GUI가 계속 응답할 수 있습니다.

위 내용은 Swing에서 이미지를 로드하는 동안 GUI 정지를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿