swing
프로젝트에서 작업 중입니다. 지도가 있습니다. 저는 주어진 시간대에 주어진 데이터의 래스터 이미지를 가지고 있습니다. 일반적으로 나는 JSlider
을 통해 시간을 변경하고 서버에 래스터 이미지를 요청합니다. 그런 다음지도에 응답 이미지를 추가합니다. Play JButton
이 있는데이 버튼을 누르면 이미지가 하나씩지도의 래스터 레이어에 추가됩니다. 그것은 애니메이션으로 보일 것입니다. 그 JButton's
actionPerfomed
메서드에서 나는 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가있는 경우
는 두 번째 활동에 대한 스레드를 만들 필요가 사전
는 [A를 게시 MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 참조하십시오. –