>  기사  >  Java  >  Javax.swing 타이머는 효과적으로 반복되지만 ActionListener는 비활성 상태로 유지되는 이유는 무엇입니까?

Javax.swing 타이머는 효과적으로 반복되지만 ActionListener는 비활성 상태로 유지되는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 11:00:02281검색

Why does my Javax.swing Timer repeat effectively, but the ActionListener remains inert?

Javax.swing 타이머는 효과적으로 반복되지만 ActionListener는 비활성 상태로 유지됩니다.

애플리케이션 애니메이션 컨텍스트에서 포스터의 배경색을 수정하는 문제가 발생했습니다. 텍스트 필드가 타이머 메커니즘을 통해 전파되고 있었지만 예상되는 응답인 반복된 변경이 화면에 시각화되지 않았습니다. 관련 코드 조각은 다음과 같습니다.

<code class="java">Flash flash = new Flash();
tmr = new javax.swing.Timer(1000, flash); 
tmr.addActionListener(flash); 
tmr.setInitialDelay(0); 
tmr.setRepeats(true); 
tmr.start();</code>

디버깅 시 액션 리스너가 대체 항목을 반복하지만 초기 변경 사항만 표시하는 것으로 확인되었습니다.

해결 방법

제시된 사례의 문제는 ActionListener 구현의 내부 결함으로 인해 발생했습니다. 이를 수정하고 기본 작업을 설명하기 위해 변동하는 채도 수준을 모델링하는 대체 솔루션이 도입되었습니다.

<code class="java">public class FlashTest extends JPanel {
    // Building blocks
    Timer t = null; // Timer for the color transitions
    Queue<Color> clut = null; // Queue for holding a cycle of hues

    // Setup method
    FlashTest() {
        clut = new LinkedList<>(); // Initialize the color cycle
        for (int i = 0; i < N; i++) {
            clut.add(Color.getHSBColor(1, 1 - (i / N), 1));
        }
        for (int i = 0; i < N; i++) {
            clut.add(Color.getHSBColor(1, i / N, 1));
        }
        t = new Timer(50, new ActionListener() { // Timer for managing color transitions
            @Override
            public void actionPerformed(ActionEvent e) {
                setBackground(clut.peek()); 
                clut.add(clut.remove()); // Color transition management
            }
        });
        t.start(); // Commencement of color cycling
    }

    // Override necessitated by color cycling
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // Call to superclass method for component depiction
        g.drawString(s, getWidth() / 2 - w2, getHeight() / 2 + h2); // Draw the text
    }

    // Launcher
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new FlashTest());
            f.pack();
            f.setVisible(true);
        });
    }
}</code>

여기서 색상 주기는 대기열에 유지되어 진행 상황을 연속적으로 묘사할 수 있습니다. 'paintComponent' 메서드는 배경에 현재 색상이 지속적으로 표시되도록 보장합니다.

이 해결 방법은 원래 문제를 해결할 뿐만 아니라 시간에 따른 색상 전환을 실제로 구현하는 방법도 보여줍니다.

위 내용은 Javax.swing 타이머는 효과적으로 반복되지만 ActionListener는 비활성 상태로 유지되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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