2016-07-26 4 views
0

swing 프로젝트에서 작업 중입니다. 지도가 있습니다. 저는 주어진 시간대에 주어진 데이터의 래스터 이미지를 가지고 있습니다. 일반적으로 나는 JSlider을 통해 시간을 변경하고 서버에 래스터 이미지를 요청합니다. 그런 다음지도에 응답 이미지를 추가합니다. Play JButton이 있는데이 버튼을 누르면 이미지가 하나씩지도의 래스터 레이어에 추가됩니다. 그것은 애니메이션으로 보일 것입니다. 그 JButton'sactionPerfomed 메서드에서 나는 for 루프에서 JSlider's 값을 변경합니다.Jslider는 값이 JButton에서 주기적으로 변경되었을 때 확인할 수 없습니다.

내 문제는 재생 JButton을 누르면 데이터가 재생되는 것을 볼 수 없지만 서버()에서 각 이미지를 기록하기 때문에 코드 블록이 작동한다는 것을 알고 있습니다. 나는 JButton의 becuse가 그 actionPerformed 방법이 끝날 때까지 Focus을 풀지 않는다는 것을 알았습니다. JButton이 끝날 때까지 눌린 것처럼 보였기 때문에. 그래서 나는지도의 마지막 이미지 만 봅니다.

먼저, JButton.setFocusable(false) 등을 시도했지만 좋지 않습니다.

두 번째로 SwingWorker을 사용해 보았습니다. 나는 이런 식으로 추가 :

class PlayMvgmLayerWorker extends SwingWorker<Void, Void> { 

public PlayMvgmLayerWorker(String title) { 
    super(title); 
} 

@Override 
protected void done(Void aVoid) { 

} 

@Override 
protected Void doInBackground() { 
    try{ 
     BufferedImage[] image = new BufferedImage[24]; 
     for(int i=0; i<24; i++) { 

      final int value = i - 48 + 24; 
      timeSlider.setValue(value); 
      Thread.sleep(10000l); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
    return null; 
} 
} 

private JButton animation = new JButton(""); 

animation.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     new PlayMvgmLayerWorker("title").execute(); 
    } 
}); 

private JSlider timeSlider = new JSlider(); 
timeSlider.addChangeListener(new ChangeListener() { 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     // time consuming processes (server call, add image to map, etc) 
    } 
}); 

나는 그것을 단순화하기 위해 노력했다.

이전보다 훨씬 좋지만 데이터가 올바르게 재생되는지 확인할 수 없습니다. 때때로 데이터는 JSlider 틱 이후에 재생됩니다. 시간이 많이 걸리는 프로세스가 second components(JSlider)stateChanged 이벤트에 있기 때문에 그럴 수 있습니까? JSlider's 이벤트에도 두 번째 SwingWorker을 사용해야합니까? 무엇을 할 수 있습니까?

또한 데이터를 재생하기 전에 모든 구성 요소를 사용하지 않도록 설정하고 데이터를 재생 한 후에 사용 설정하는 것이 가장 좋은 방법은 무엇입니까? 동시에 실행해야 할 두 가지 활동 활동 A와 활동 B가있는 경우

는 두 번째 활동에 대한 스레드를 만들 필요가 사전

+0

는 [A를 게시 MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 참조하십시오. –

답변

1

당신에게 대단히 감사합니다 - 첫번째 활동이 이미 실행됩니다 자체 스레드 (메인 프로그램). 다음과 같이

이 계획은 다음과 같습니다 더 구체적인 측면에서

Program A: 

    create new Thread: Activity B 

    run allother tasks for Activity A 

슬라이더의 틱 시뮬레이션을 실행하고 업데이트합니다 다음 프로그램 : 빨리 더 나은 도움이 필요한

public P() { 

animation.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     doInBackgroundImp(); 
    } 
}); 

    setSize(500, 500); 
    setLayout(new FlowLayout()); 
    add(animation); 
    add(timeSlider); 
    setVisible(true); 
} 

protected void doInBackgroundImp() { 
    Thread th=new Thread() { 
     public void run() { 
    try{ 
     for(int i=0; i<24; i++) { 

      final int value = i - 48 + 24; 
      timeSlider.setValue(i); 
      System.out.println(timeSlider.getValue()+" "+value); 
      Thread.sleep(1000); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
     } 
    }; 
    th.start(); 
} 

private JButton animation = new JButton(""); 

private JSlider timeSlider = new JSlider(); 

} 
관련 문제