> Java > java지도 시간 > 본문

장기 실행 작업 결과로 JLabel을 지속적으로 업데이트하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-24 05:06:30
원래의
551명이 탐색했습니다.

How to Continuously Update JLabel with Results of Long-Running Task?

장기 실행 작업 결과로 JLabel 업데이트

문제:

다음을 목표로 합니다. 서버에 지속적으로 핑을 보내고 JLabel에서 핑 결과를 업데이트하는 프로그램을 만듭니다.

초기 접근 방식:

첫 번째 시도에는 setPing() 메서드를 한 번 호출하는 것이 포함되었습니다. formWindowOpened() 이벤트. 이것이 작동하는 동안 작업은 한 번만 수행되었습니다.

두 번째 접근 방식:

이후 노력으로 인해 formWindowOpened() 내에서 무한 루프가 발생했습니다. 그러나 이 접근 방식은 setPing() 메서드를 한 번도 실행하지 못했습니다.

Swing Timer 및 SwingWorker를 사용한 솔루션:

이 문제를 해결하려면 Swing Timer 활용을 고려하세요. 사전 정의된 간격으로 장기 실행 작업(이 경우 setPing() 메서드)의 실행을 예약합니다. 이 접근 방식은 SwingWorker를 활용하여 별도의 스레드에서 setPing() 메서드를 실행함으로써 응답성을 활성화하고 GUI 정지를 방지합니다.

다음은 이 접근 방식을 구현하는 코드 조각입니다.

<code class="java">import java.awt.event.*;
import javax.swing.*;
import java.net.Socket;

public class LabelUpdateUsingTimer {

    static String hostnameOrIP = "stackoverflow.com";
    int delay = 5000;
    JLabel label = new JLabel("0000");

    LabelUpdateUsingTimer() {
        label.setFont(label.getFont().deriveFont(120f));

        ActionListener timerListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new PingWorker().execute();
            }
        };
        Timer timer = new Timer(delay, timerListener);

        timer.start();
        JOptionPane.showMessageDialog(
                null, label, hostnameOrIP, JOptionPane.INFORMATION_MESSAGE);
        timer.stop();
    }

    class PingWorker extends SwingWorker {

        int time;

        @Override
        protected Object doInBackground() throws Exception {
            time = pingTime();
            return new Integer(time);
        }

        @Override
        protected void done() {
            label.setText("" + time);
        }
    };

    public static int pingTime() {
        Socket socket = null;
        long start = System.currentTimeMillis();
        try {
            socket = new Socket(hostnameOrIP, 80);
        } catch (Exception weTried) {
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (Exception weTried) {}
            }
        }
        long end = System.currentTimeMillis();
        return (int) (end - start);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new LabelUpdateUsingTimer();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}</code>
로그인 후 복사

여기서 코드:

  • Swing Timer는 PingWorker의 실행을 반복적으로 예약합니다.
  • SwingWorker는 백그라운드에서 setPing()을 실행하고 완료 시 GUI를 업데이트합니다.

이 접근 방식을 사용하면 장기 실행 작업이 GUI 스레드를 차단하지 않고 응답성을 유지하면서 정기적으로 ping 결과로 JLabel을 업데이트할 수 있습니다.

위 내용은 장기 실행 작업 결과로 JLabel을 지속적으로 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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