SwingWorker 스레드 내에서 JLabel 업데이트가 제대로 작동하지 않음

Abhishek Choudhary

다음과 같은 예상되는 동작으로 JLabel을 업데이트하려고합니다.

COND 1 : JLabel이 5 초 동안 표시되고 다음 3 초 동안 표시되지 않고 5 초 동안 표시되어야합니다.

COND 2 : JLabel이 0.5 초 동안 표시되고 다음 3 초 동안 보이지 않아야합니다.

순열 조합의 종류에 따라 동작이 작동합니다. 다음은 샘플 코드입니다.

import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class Main
{
    static CounterTask task;

    public static void main ( String[] args )
    {

        final JLabel label = new JLabel( "TEST ME " );
        JButton startButton = new JButton( "Start" );
        startButton.addActionListener( new ActionListener()
        {
            public void actionPerformed ( ActionEvent e )
            {
                task = new CounterTask( label );
                task.execute();
            }
        } );

        JButton cancelButton = new JButton( "Cancel" );
        cancelButton.addActionListener( new ActionListener()
        {
            public void actionPerformed ( ActionEvent e )
            {
                task.cancel( true );
            }
        } );

        JPanel buttonPanel = new JPanel();
        buttonPanel.add( startButton );
        buttonPanel.add( cancelButton );

        JPanel cp = new JPanel();
        LayoutManager layout = new BoxLayout( cp, BoxLayout.Y_AXIS );
        cp.setLayout( layout );
        cp.add( buttonPanel );
        cp.add( label );

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setContentPane( cp );
        frame.pack();
        frame.setVisible( true );
    }
}

class CounterTask
    extends SwingWorker< Integer, Integer >
{
    int DELAY = 3000;

    JLabel label;

    int WAIT = 5000;

    public CounterTask ( JLabel label )
    {
        this.label = label;
    }

    @Override
    protected Integer doInBackground () throws Exception
    {
        int i = 0;
        int count = 1000;
        while ( !isCancelled() && i < count )
        {
            i++;
            publish( new Integer[] { i } );
            label.setVisible( false );
            Thread.sleep( DELAY );
        }
        return count;
    }

    protected void process ( List< Integer > chunks )
    {
        Integer strContent = chunks.get( chunks.size() - 1 );
        label.setVisible( true );
        label.validate();
        label.setText( "DISPLAYING " + strContent );
        try
        {
            Thread.sleep( WAIT );
        }
        catch ( InterruptedException e )
        {
            e.printStackTrace();
        }
    }

    @Override
    protected void done ()
    {
        if ( isCancelled() )
            System.out.println( "Cancelled !" );
        else
            System.out.println( "Done !" );
    }
}

이 조합이 일부 데이터에 대해 작동하고 대부분 JLabel이 전체적으로 보이지 않기 때문에 분명히 뭔가 잘못하고 있지만 SOP를 넣으면 적절한 지연과 대기 시간에 적절한 데이터를 얻습니다.

Swing 워커의 위 코드에는 두 개의 변수 WAIT DELAY가 있습니다. WAIT는 JLabel을 X 초 동안 표시하고 DELAY는 JLAbel을 Y 초 동안 보이지 않게합니다. 그러나 다른 파마와 빗으로 시도하면 JLabel 가시성이 예상대로 작동하지 않는다는 것을 알게 될 것입니다. Label의 EDT 업데이트 또는 다시 그리기와 관련된 것일 수 있습니다. 근본 원인이 확실하지 않습니다.

예상 :

  1. 코드가 SOP처럼 작동하거나 이상적인 경우에 작동하도록 만들고 싶습니다.
  2. 제대로 작동하지 않는 이유를 알아야합니다.
Jk1

SwingWorker는 깜박이는 레이블에 대한 과잉입니다. 다음 타이머 기반 접근 방식을 시도해보십시오. 스레드 마법이 전혀 필요하지 않습니다.

public class Main {
private static Timer setVisibleTimer;
private static Timer setInvisibleTimer;

public static void main(String[] args) {

    final JLabel label = new JLabel("TEST ME ");
    JButton startButton = new JButton("Start");
    startButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            setVisibleTimer = new Timer(8000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setVisible(true);
                }
            });
            setInvisibleTimer = new Timer(5000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setVisible(false);
                }
            });
            setVisibleTimer.start();
            setInvisibleTimer.start();
        }
    });

    JButton cancelButton = new JButton("Cancel");
    cancelButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            label.setVisible(true);
            if (setVisibleTimer != null){
                setInvisibleTimer.stop();
                setVisibleTimer.stop();
            }
        }
    });

    JPanel buttonPanel = new JPanel();
    buttonPanel.add(startButton);
    buttonPanel.add(cancelButton);

    JPanel cp = new JPanel();
    LayoutManager layout = new BoxLayout(cp, BoxLayout.Y_AXIS);
    cp.setLayout(layout);
    cp.add(buttonPanel);
    cp.add(label);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(cp);
    frame.pack();
    frame.setVisible(true);
}
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

SwingWorker 내에서 JProgress 막대가 업데이트되지 않음

분류에서Dev

Netbeans에서 JLabel 텍스트 설정이 작동하지 않음

분류에서Dev

업데이트 14.04에서 14.10으로 사운드가 작동하지 않음

분류에서Dev

안드로이드 데이터베이스 업데이트가 제대로 작동하지 않음

분류에서Dev

python : 스레드가 데몬에서 제대로 작동하지 않습니다.

분류에서Dev

SetInterval 메서드에서 React State가 제대로 업데이트되지 않음

분류에서Dev

여러 스레드 Jmeter에 대한 CSV 데이터 세트 구성에서 JUnit 샘플러가 제대로 작동하지 않음

분류에서Dev

레일에서 Javascript 코드가 제대로 작동하지 않음

분류에서Dev

Firefox에서 CSS 스프라이트가 제대로 작동하지 않음

분류에서Dev

타이머에서 JUnit 테스트가 제대로 작동하지 않음

분류에서Dev

Lubuntu를 17.04에서 17.10으로 업그레이드 한 후 "소프트웨어 및 업데이트"가 제대로 작동하지 않습니다.

분류에서Dev

웹 사이트에 Java 업로드가 작동하지 않음

분류에서Dev

JLabel ImageIcon이 제대로 스무딩되지 않음

분류에서Dev

drawCircle 메서드가 제대로 작동하지 않음 (Android)

분류에서Dev

Java 교차 메서드가 제대로 작동하지 않음

분류에서Dev

Windows 서비스가 제대로 작동하지 않음

분류에서Dev

CSS 변수에서 SVG 스트로크가 제대로 작동하지 않음

분류에서Dev

IE에서 SVG 텍스트 경로가 제대로 작동하지 않음

분류에서Dev

PHP 및 MySql에서 대량 업데이트로 일부 레코드가 업데이트되지 않음

분류에서Dev

레일에서 제대로 작동하지 않는 데이터베이스에서 레코드 생성

분류에서Dev

Ubuntu 14.04 LTS에서 더 이상 자동 디스플레이 감지가 제대로 작동하지 않음

분류에서Dev

if 문 내에서 변수가 제대로 업데이트되지 않음-Javascript / Jquery

분류에서Dev

Android에서 미디어 플레이어가 제대로 작동하지 않음

분류에서Dev

핵심 데이터 : 백그라운드 NSManagedObjectContext에 대한 업데이트가 저장시 작동하지 않음

분류에서Dev

crontab에서 Bash 스크립트가 제대로 작동하지 않음

분류에서Dev

PHP While 루프 내에서 호출 된 jQuery 스크립트가 제대로 작동하지 않음

분류에서Dev

GKE에서 클러스터 업데이트 후 컨테이너 로그가 작동하지 않음

분류에서Dev

내 프로젝트에서 그리드 카드 레이아웃이 제대로 작동하지 않습니다.

분류에서Dev

특정 호스트에서 PHP 세션이 제대로 작동하지 않음

Related 관련 기사

  1. 1

    SwingWorker 내에서 JProgress 막대가 업데이트되지 않음

  2. 2

    Netbeans에서 JLabel 텍스트 설정이 작동하지 않음

  3. 3

    업데이트 14.04에서 14.10으로 사운드가 작동하지 않음

  4. 4

    안드로이드 데이터베이스 업데이트가 제대로 작동하지 않음

  5. 5

    python : 스레드가 데몬에서 제대로 작동하지 않습니다.

  6. 6

    SetInterval 메서드에서 React State가 제대로 업데이트되지 않음

  7. 7

    여러 스레드 Jmeter에 대한 CSV 데이터 세트 구성에서 JUnit 샘플러가 제대로 작동하지 않음

  8. 8

    레일에서 Javascript 코드가 제대로 작동하지 않음

  9. 9

    Firefox에서 CSS 스프라이트가 제대로 작동하지 않음

  10. 10

    타이머에서 JUnit 테스트가 제대로 작동하지 않음

  11. 11

    Lubuntu를 17.04에서 17.10으로 업그레이드 한 후 "소프트웨어 및 업데이트"가 제대로 작동하지 않습니다.

  12. 12

    웹 사이트에 Java 업로드가 작동하지 않음

  13. 13

    JLabel ImageIcon이 제대로 스무딩되지 않음

  14. 14

    drawCircle 메서드가 제대로 작동하지 않음 (Android)

  15. 15

    Java 교차 메서드가 제대로 작동하지 않음

  16. 16

    Windows 서비스가 제대로 작동하지 않음

  17. 17

    CSS 변수에서 SVG 스트로크가 제대로 작동하지 않음

  18. 18

    IE에서 SVG 텍스트 경로가 제대로 작동하지 않음

  19. 19

    PHP 및 MySql에서 대량 업데이트로 일부 레코드가 업데이트되지 않음

  20. 20

    레일에서 제대로 작동하지 않는 데이터베이스에서 레코드 생성

  21. 21

    Ubuntu 14.04 LTS에서 더 이상 자동 디스플레이 감지가 제대로 작동하지 않음

  22. 22

    if 문 내에서 변수가 제대로 업데이트되지 않음-Javascript / Jquery

  23. 23

    Android에서 미디어 플레이어가 제대로 작동하지 않음

  24. 24

    핵심 데이터 : 백그라운드 NSManagedObjectContext에 대한 업데이트가 저장시 작동하지 않음

  25. 25

    crontab에서 Bash 스크립트가 제대로 작동하지 않음

  26. 26

    PHP While 루프 내에서 호출 된 jQuery 스크립트가 제대로 작동하지 않음

  27. 27

    GKE에서 클러스터 업데이트 후 컨테이너 로그가 작동하지 않음

  28. 28

    내 프로젝트에서 그리드 카드 레이아웃이 제대로 작동하지 않습니다.

  29. 29

    특정 호스트에서 PHP 세션이 제대로 작동하지 않음

뜨겁다태그

보관