flutter : flux : swing

moon.kick·2025년 3월 6일

아래 코드는 버튼을 클릭할 때마다 새로운 스레드가 시작되어 text2가 여러 스레드에 의해 업데이트되는 현상을 방지하기 위해,
깜빡임 중복 실행을 막는 코드를 추가한 예제입니다.
즉, 이미 깜빡임이 진행 중이면 새 스레드를 실행하지 않고 그대로 두도록 합니다.
주석으로 [텍스트2 깜빡임 중복 실행 방지] 부분을 표시해두었으니 참고하세요.

// 버튼 클릭 시 a-z까지 text2 출력(깜빡임) - 이벤트 처리
btn.addActionListener((e) -> {
    // [텍스트2 깜빡임 중복 실행 방지]
    // 이미 깜빡임 중이면 새 스레드를 실행하지 않도록 처리
    if (isBlinking) {
        return; // 아무 작업도 하지 않음
    }
    
    // 깜빡임 시작 전에 isBlinking을 true로 설정
    isBlinking = true;
    
    blinkThread = new Thread(() -> {
        // 'A'부터 'z'까지 반복하면서 깜빡임 구현
        for (char ch = 'A'; ch <= 'z' && isBlinking; ch++) {
            final char currentChar = ch;  // ch 값을 final 변수에 저장
            SwingUtilities.invokeLater(() -> text2.setText(currentChar + " "));
            try {
                Thread.sleep(200);
            } catch (InterruptedException ex) {
                // 인터럽트 발생 시 반복 종료
                break;
            }
        }
        // 반복 종료 후 깜빡임 상태 초기화
        isBlinking = false;
    });
    blinkThread.start();
});

설명

  • [텍스트2 깜빡임 중복 실행 방지]
    기존 코드에서는 버튼을 클릭할 때마다 새로운 스레드가 생성되어 실행되므로, 여러 번 클릭하면 여러 스레드가 동시에 text2를 업데이트하여 속도가 빨라지는 현상이 발생합니다.
    이를 막기 위해 if (isBlinking) { return; } 코드를 추가하여, 이미 깜빡임이 진행 중일 경우에는 새 스레드를 시작하지 않습니다.

  • isBlinking 설정
    버튼 클릭 시 깜빡임을 시작하기 전에 isBlinking을 true로 설정하여, 이미 깜빡이는 상태임을 표시합니다.

  • 람다식 내부 final 변수 사용
    for문 내의 ch는 변경되므로, 이를 final 변수인 currentChar에 할당하여 SwingUtilities.invokeLater()에서 안전하게 사용할 수 있도록 합니다.

이렇게 수정하면, text1의 업데이트 속도는 그대로 유지되고, text2는 버튼 클릭 시 중복 실행 없이 깜빡임 효과가 정상적으로 동작합니다.

profile
@mgkick

0개의 댓글