У меня есть апплет, который выбирает аудиофайл из JFileChooser. Два JSlider создаются или обновляются в соответствии с длиной клипа и называются «точка A» и «точка B». Нажимается кнопка J, после чего файл воспроизводится до точки А. Когда он достигает точки А, клип начинает зацикливать звук из точки А в точку Б с плавным переходом.
Проблема в том, что я должен убедиться, что точка А никогда не выходит за пределы точки Б по очевидным причинам, но мой метод для этого не работает.
Добавление прослушивателя изменений, который обновляется, когда исходный JSlider обновляется или не обновляется, - это две вещи, которые я пробовал. Для !source.getValueIsAdjusting()
он работает для использования клавиш со стрелками, но не для мыши, а для source.getValueIsAdjusting()
он работает с задержкой: кажется, что он либо сравнивает, либо сбрасывает значения с опозданием.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SliderExample extends JApplet{
private MyPanel panel;
private final Random rand = new Random();
public SliderExample() {
panel = new MyPanel();
add(panel);
}
private class MyPanel extends JPanel implements
ActionListener{
private JSlider sliderA, sliderB;
private final Timer t = new Timer(20, this);
public MyPanel()
{
super(false);
sliderA = new JSlider(JSlider.HORIZONTAL, 0, 20, 5);
sliderB = new JSlider(JSlider.HORIZONTAL, 0, 20, 15);
sliderA.setBorder(BorderFactory.createTitledBorder("Point A"));
sliderB.setBorder(BorderFactory.createTitledBorder("Point B"));
sliderA.setMajorTickSpacing(5);
sliderB.setMajorTickSpacing(5);
sliderA.setMinorTickSpacing(1);
sliderB.setMinorTickSpacing(1);
sliderA.setPaintTicks(true);
sliderB.setPaintTicks(true);
sliderA.setPaintLabels(true);
sliderB.setPaintLabels(true);
sliderA.addChangeListener(new SliderHandler());
sliderB.addChangeListener(new SliderHandler());
add(sliderA);
add(sliderB);
t.start();
}
@Override
public void actionPerformed(ActionEvent e) {
// uncomment these to see that the slider set value does work
// sliderA.setValue(rand.nextInt(sliderA.getMaximum()));
// sliderB.setValue(rand.nextInt(sliderB.getMaximum()));
int A = sliderA.getValue();
int B = sliderB.getValue();
if (A > B)
{
System.out.println("ERROR: slider A is: " + A + " and slider B is : " + B);
sliderA.setValue(B);
}
}
private class SliderHandler implements ChangeListener
{
private SliderHandler()
{
}
public void stateChanged(ChangeEvent e)
{
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting())
{
if (source == sliderA)
{
if (source.getValue() > sliderB.getValue())
{
source.setValue(sliderB.getValue());
}
}
else if (source == sliderB)
{
if (source.getValue() < sliderA.getValue())
{
source.setValue(sliderA.getValue());
}
}
}
}
}
}
}
getValueIsAdjusting
мешает обновлениям. Если вы удалите это, вы сможете выполнять непрерывную проверку каждый раз при изменении состояния. Я также думаю, что вы сравниваете неправильно.if a > b then b = a
, а неa = b
, но это только мои ожидания... - person MadProgrammer   schedule 12.11.2013setSnapToTicks(true)
на своих JSliders. - person Hovercraft Full Of Eels   schedule 12.11.2013