我正在开发一个 swing
项目。有一张 map ,我有不同时间给定数据的光栅图像。通常我通过 JSlider 更改时间,并请求服务器提供光栅图像。然后我将响应图像添加到 map 中。有一个 Play JButton
,当按下它时,它将把这些图像一一添加到 map 的栅格图层中。它将被视为动画。在该 JButton
actionPerfomed
方法中,我在 for 循环中更改了 JSlider's
值。
我的问题是,当我按下“播放JButton
”时,我看不到正在播放的数据,但我知道代码块有效,因为我记录了每个图像(来自服务器)。我发现这是因为JButton
在其actionPerformed
方法结束之前不会释放Focus
。因为 JButton
看起来像是一直被按下直到最后。所以我只能看到 map 中的最后一个图像。
首先,我尝试了 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
刻度之后播放。难道是因为我的耗时过程是在第二个组件(JSlider)
stateChanged
事件中?我是否也应该在 JSlider's
事件中使用第二个 SwingWorker
?关于我能做什么有什么建议吗?
此外,在播放数据之前禁用所有组件并在播放数据之后启用它们的最佳方法是什么?
提前非常感谢
最佳答案
如果您有两个 Activity “Activity A”和“Activity B”必须同时运行,则需要为第二个 Activity 创建一个线程 - 第一个 Activity 已在其自己的线程(主程序)中运行。
方案如下:
Program A:
create new Thread: Activity B
run allother tasks for Activity A
更具体地说,以下程序将运行您的模拟并更新 slider 的刻度:
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();
}
关于java - Jslider从JButton周期性改变值时无法勾选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38590350/