java - Swing 中的音频波形选择

标签 java swing audio waveform

我正在研究音频编辑器。每个波形都在自己的 JPanel 中绘制。这些 JPanel 位于另一个 JPanel 中,它是波形和时间轴的容器。这个容器在 JScrollPane 中。

现在我必须为 Selection 类编写 View ,但我不知道哪个 Swing 组件最好。选择应该绘制在波形(或所有容器)上,应该非常透明并且应该是可拖动的(不可调整大小,只是可拖动)随时间变化轴。

你会怎么做?

最佳答案

当我做这件事时,我将 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() 方法内部,将其绘制的一部分委托(delegate)给可见 View 中的每个叠加层。

相同的概念适用于鼠标移动事件、鼠标点击等。

关于java - Swing 中的音频波形选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251802/

相关文章:

java - 这似乎用红色下划线

Java Swing : Can't show several instances of my JPanel

java - 为什么我的 move() 方法不能将球保持在界内?

iphone - 使用 UIImage 和 caf 创建视频文件的问题

iphone - (iPhone)如何使用AVAudioPlayer顺序播放声音?

java - 除了Switch语句和多态之外,如何替换这么多if else条件

java - 当单元格有更多字段时,我无法单击表格中的复选框

java - Selenium 无法在带有 iframe 的模态窗口中找到元素

javascript - 按键时声音元素未播放

java - Java 可以处理 Expando 吗?