버튼을 클릭하면 웹에서 이미지가 로드되어 다른 JFrame 내의 패널. 하지만 이로 인해 이미지 로딩 과정에서 애플리케이션 창이 일시적으로 멈추게 됩니다.
이 문제는 버튼의 쿼리가 EDT(이벤트 디스패치 스레드)에서 실행되기 때문에 발생합니다. 이 스레드는 모든 GUI 업데이트를 처리하므로 차단되면 애플리케이션이 응답하지 않게 됩니다.
멈추는 것을 방지하려면 이미지가 백그라운드에서 로드되어야 합니다. GUI는 계속 응답합니다. 이는 javax.swing.SwingWorker 클래스를 사용하여 달성할 수 있습니다.
SwingWorker는 EDT를 차단하지 않고 백그라운드에서 작업을 실행할 수 있는 스레드로부터 안전한 클래스입니다. 실행할 작업을 설정한 후 별도의 스레드에서 실행하는 방법을 제공합니다.
다음은 SwingWorker를 사용하여 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(); } } } }
이 코드에서:
위 내용은 SwingWorker를 사용하여 GUI를 정지하지 않고 이미지를 표시하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!