2011-08-31 73 views
3

我正在使用音频编辑器。每个波形都在自己的JPanel中绘制。那些JPanel在另一个JPanel中,这是一个波形和时间线的容器。此容器位于JScrollPane中。Swing中的音频波形选择

现在我必须为Selection类编写视图,我不知道哪个Swing组件最好。选择波形(或所有容器),应该是相当透明应可拖动(不可调整大小,只是可拖动)沿时间轴。

你会怎么做?

回答

2

问题&答案Finding local Minimum可能会提示拖动波形选区的方法。

附录:要生效z - 订购,请考虑layered pane

+0

我知道如何找到启动和选择的结束,bocause我已经拥有它的选择模型来实现。问题是,我不知道我应该使用什么挥杆组件。我不知道如何在现有JPanel上创建另一个图层。我是一个web开发者,我认为它是z-index较高的另一个div;)。 – ciembor

4

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

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