【问题标题】:Audio waveform selection in SwingSwing 中的音频波形选择
【发布时间】:2011-08-31 01:58:26
【问题描述】:

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

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

你会怎么做?

【问题讨论】:

    标签: java swing audio waveform


    【解决方案1】:

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

    同样的概念也适用于鼠标运动事件、鼠标点击等。

    【讨论】:

      【解决方案2】:

      问答Finding local Minimum 可能会建议一种在波形中拖动选择的方法。

      附录:要实现 z 排序,请考虑使用layered pane

      【讨论】:

      • 我知道如何找到选择的开始和结束,因为我已经在选择模型中实现了它。问题是,我不知道应该使用什么摆动组件。我不知道如何在现有的 JPanel 上制作类似另一层的东西。我是一名网络开发人员,我认为它是另一个具有更高 z-index 的 div;)。
      猜你喜欢
      • 2016-12-09
      • 2017-07-08
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2012-11-16
      相关资源
      最近更新 更多