Выбор звуковой волны в Swing

Я работаю над аудио редактором. Каждый сигнал рисуется в собственной JPanel. Эти панели JPanel находятся внутри другой панели JPanel, которая является контейнером для сигналов и временной шкалы. И этот контейнер находится в JScrollPane.

Теперь мне нужно написать представление для класса Selection, и я не знаю, какой компонент Swing будет лучшим. Выделение должно быть нарисовано по формам волны (или всему контейнеру), должно быть достаточно прозрачным и должно быть перетаскиваемым (не изменяемым по размеру, просто перетаскиваемым) во времени ось.

Как бы Вы это сделали?


person ciembor    schedule 31.08.2011    source источник


Ответы (2)


Когда я сделал именно это, я создал подкласс JComponent. Причина в том, что компонент просмотра формы волны на самом деле не является контейнером. Вы не собираетесь устанавливать менеджер компоновки или добавлять к нему дочерние элементы и т. д. У вас могут быть специальные компоненты, которые могут быть похожими на дочерние элементы, скажем, флаги, аннотации и т. д., но они, вероятно, не будут действовать как компоненты Swing. Кроме того, использование вашей собственной версии позволяет очень легко создавать более легкие компоненты, чем качели. На самом деле у меня было большинство из этих концепций: 1 или более выделений, точки цикла, флаги, головка воспроизведения и т. д.

Мой компонент работал примерно так:

public class AudioView extends JComponent implements Scrollable {

   private float samplesPerPixel = 1.0f;
   private PlayHeadOverlay playHead;
   private List<WaveformOverlay> overlays = new ArrayList<WaveformOverlay>();
   private WaveformOverlay selected = null;

   protected void paintComponent( Graphics graphics ) {
      ... // all the math for drawing the waveform
      for( WaveformOverlay overlay : overlays ) {
          overlay.paint( graphics );
      }
   }
}

public abstract class WaveformOverlay implements EventDispatcher {
   public boolean isVisible() { return visible; }
   public void setVisible( visible ) { this.visible = visible; }

   public abstract paint( Graphics graphics );

   public boolean isWithin(Point point) {
      return false; // subclasses override this so we can know if they are inside the overlay (eg mouse events).
   }

   public String getToolTipText() {
      return null; // override this if you want a tooltip upon mouse over
   }
}

Это примерно то, что реализует каждый оверлей. Существует несколько других методов обработки диспетчеризации событий, прослушивания и т. д. Выделения, флаги, точка воспроизведения, аннотации — все они реализуют WaveformOverlay. Внутри метода AudioView.paintComponent() делегирует часть своего рисунка каждому наложению в видимом представлении.

Та же концепция применяется к событиям движения мыши, щелчкам мыши и т. д.

person chubbsondubs    schedule 31.08.2011

Вопрос и ответ, Поиск локального минимума, может предложить подход к перетаскиванию выделения в форме волны. .

Приложение. Чтобы реализовать z-упорядочение, используйте многослойная панель.

person trashgod    schedule 31.08.2011
comment
Я знаю, как найти начало и конец выбора, потому что он уже реализован в модели выбора. Проблема в том, что я не знаю, какой компонент свинга мне следует использовать. Я не знаю, как сделать что-то вроде еще одного слоя поверх существующих JPanel. Я веб-разработчик, поэтому я думаю об этом как о еще одном div с более высоким z-индексом;). - person ciembor; 31.08.2011