私のプログラムにJSliderがあります。スライダの値が変更されると、プログラムは何かをします。私がしたいのは、スライダの値をその最大値まで増加させ、ChangeListenerクラスで行うことのためにスライダの値が増加するたびに待つ必要があるということです。リスナーが動作している間にJavaプログラムを待機させる方法は?
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();
}
}
}
});
私は= 10、その後、プログラムは、私は眠りに使用さ10×1000(milisecondを待つならば、問題は、例えば、(:ここ
は私の関連するコード(svPlayが再生ボタンのようなものである)であります)メソッド)を実行し、同時にすべての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秒間待たなければなりません。どうやってやるの? – JollyRoger
@CoderinoJavarino実際にこのコードをプログラムに変換しようとしましたが、できませんでした。あなたは次の答えを見ていただけますか? – JollyRoger