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

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

Barbara Streisand
Barbara Streisand원래의
2024-10-24 02:35:29662검색

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

장기 실행 작업 결과로 JLabel을 반복적으로 업데이트

문제:

Java 프로그램 장기 실행 작업(서버에 대한 핑)의 결과로 JLabel을 지속적으로 업데이트하려고 시도합니다. 초기 구현에서는 작업을 한 번만 수행했지만 반복 작업을 생성하려는 시도는 작동하지 않습니다.

해결책:

이 문제를 해결하기 위해 프로그램에서는 두 가지 방법을 활용합니다. 기술:

  1. 반복 작업을 위한 스윙 타이머: 타이머 내의 ActionListener는 지정된 지연 시간에 작업을 반복적으로 호출합니다. 이 접근 방식은 장기 실행 작업을 트리거하기 위해 여기에 적용됩니다.
  2. 장기 실행 작업을 위한 SwingWorker: SwingWorker 클래스는 스레드를 차단하지 않고 백그라운드 스레드에서 장기 실행 작업을 실행하는 메커니즘을 제공합니다. 메인(이벤트 디스패치) 스레드. 이 컨텍스트에서 PingWorker는 핑 작업을 실행하는 데 사용됩니다.

코드 조각:

다음 코드는 이러한 기술을 결합하여 원하는 동작을 달성합니다.

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

설명:

  1. 타이머의 ActionListener는 지연 밀리초마다 SwingWorker 작업(PingWorker)의 실행을 트리거합니다.
  2. PingWorker는 백그라운드에서 장기 실행 핑 작업을 실행하고 완료되면 핑 시간을 반환합니다.
  3. 완료되면 PingWorker의 done() 메서드가 결과로 JLabel을 업데이트합니다.
  4. pingTime() 메소드는 핑 시간을 측정하기 위해 지정된 호스트에 대한 소켓 연결을 설정합니다.

이 구현을 통해 GUI의 응답성을 방해하지 않고 JLabel이 최신 핑 시간으로 반복적으로 업데이트됩니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.