Swing中的音频波形选择

3
我正在开发一个音频编辑器。每个波形都在自己的JPanel中绘制。这些JPanel位于另一个JPanel中,它是波形和时间轴的容器。而这个容器位于一个JScrollPane中。
现在我需要为Selection类编写视图,但我不知道哪种Swing组件最好。选择应该在波形(或整个容器)上被绘制,应该相当透明,并且沿时间轴可拖动(不可调整大小,只能拖动)。
您会如何解决这个问题?
2个回答

4
当我做这件事时,我子类化了JComponent。原因是波形查看器组件实际上不是一个容器。您不会设置布局管理器或添加子级等。您可以拥有特殊的组件,例如标志、注释等,但它们可能不会像Swing组件一样工作。此外,使用自己的版本比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()方法中,将可见视图内的一部分绘制委托给每个叠加层。

鼠标移动事件、鼠标单击等也应用了相同的概念。


2

我知道如何找到选择的开始和结束,因为我已经在选择模型中实现了它。问题是,我不知道应该使用哪个Swing组件。我不知道如何创建类似于现有JPanels上的另一层。作为Web开发人员,我认为它就像具有更高z-index的另一个div。 - ciembor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接