flutter : flux : swing

moon.kick·2025년 3월 6일
0

아래 코드는 버튼을 클릭할 때마다 새로운 스레드가 시작되어 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개의 댓글