【发布时间】:2017-10-21 16:17:54
【问题描述】:
我的程序中有一个 JSlider。当滑块的值改变时,程序会做一些事情。我想要做的是增加滑块的值直到它的最大值,我需要等待每次滑块值增加我在 ChangeListener 类中所做的事情。
这是我的相关代码(svPlay就像一个播放按钮):
this.svPlay.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(int i=slider.getValue()+1;i<=slider.getMaximum();i++){
slider.setValue(i);
try{
Thread.sleep(1000);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
});
问题是,例如,如果 i=10,那么程序会等待 10*1000(我在 sleep() 方法中使用的毫秒),它会同时执行所有 changeListener 作业。
在 slider.setValue(i) 之后,changeListener 必须工作,然后程序应该休眠 1000 毫秒。我该怎么做?
编辑:这就是我根据上面的代码更改程序的方式。但是现在当滑块值改变并且滑块“冻结”时什么都没有发生。
this.slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
new Thread(() -> {
try {
synchronized (lock) {
Thread.sleep(1234);
if(checkBox.isSelected()){
CyApplicationManager manager = adapter.getCyApplicationManager();
CyNetworkView networkView = manager.getCurrentNetworkView();
CyNetwork network = networkView.getModel();
CyTable table = network.getDefaultNodeTable();
FilterUtil filter = new FilterUtil(network,table);
ArrayList<CyNode> activities = filter.FilterRowByNodeType("activity", "nodeType");
CyColumn timeColumn = table.getColumn("startTime"); // Getting start time column
List<String> timeList = filter.getTimeFromColumn(timeColumn); // Gets value of start time column without null value
sliderVisualization.sortActivityTimes(timeList, activities);
sliderLabel.setText(timeList.get(slider.getValue()));
sliderVisualization.hideFutureNodes(timeList, filter, network, networkView);
networkView.updateView();
}
lock.notify();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}).start();
}
});
this.svPlay.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread(() -> {
slider.setEnabled(false);
for(int i=slider.getValue()+1;i<=slider.getMaximum();i++){
synchronized (lock) {
slider.setValue(i);
try {
lock.wait();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
slider.setEnabled(true);
}).start();
}
});
我在 addChangeListener 方法中的 Thread.sleep() 之前和之后放置了 if 语句,但两种方式都不起作用。我不知道我是否转换它。你能帮忙看看这段代码吗?
【问题讨论】:
-
我不清楚你到底想达到什么目标。还要睡任意时间,因为您正在等待我认为要在不同线程上完成的事情是不好的方法。最好在 svPlay 监听器中使用
wait,在滑块监听器中使用notify。 -
@CoderinoJavarino 我尝试了 notify 和 notifyAll 但没有奏效。这一次,滑块更改的侦听器内部的东西只有我单击 svPlay 按钮才有效。我只想这样:每次更改滑块值并且滑块更改侦听器工作后,程序应等待 1 秒。我该怎么做?
-
@CoderinoJavarino 实际上我试图将此代码转换为我的程序,但我无法成功。可以看看下一个答案吗?