Swing中的音频波形选择
问题描述:
我正在使用音频编辑器。每个波形都在自己的JPanel中绘制。那些JPanel在另一个JPanel中,这是一个波形和时间线的容器。此容器位于JScrollPane中。Swing中的音频波形选择
现在我必须为Selection类编写视图,我不知道哪个Swing组件最好。选择波形(或所有容器),应该是相当透明和应可拖动(不可调整大小,只是可拖动)沿时间轴。
你会怎么做?
答
当我做了这个确切的事情,我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()方法内部将其绘图的一部分委托给可见视图内的每个叠加层。
相同的概念适用于鼠标移动事件,鼠标点击等
我知道如何找到启动和选择的结束,bocause我已经拥有它的选择模型来实现。问题是,我不知道我应该使用什么挥杆组件。我不知道如何在现有JPanel上创建另一个图层。我是一个web开发者,我认为它是z-index较高的另一个div;)。 – ciembor