我正在研究音频编辑器。每个波形都在自己的 JPanel 中绘制。这些 JPanel 位于另一个 JPanel 中,该 JPanel 是波形和时间线的容器。这个容器在一个 JScrollPane 中。
现在我必须为 Selection 类编写视图,但我不知道哪个 Swing 组件是最好的。选择应该在波形(或所有容器)上绘制,应该非常透明并且应该可以沿时间轴拖动(不可调整大小,只是可拖动)。
你会怎么做?
当我做这件事时,我将 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() 方法内部,将其绘制的一部分委托给可见视图中的每个叠加层。
相同的概念适用于鼠标运动事件、鼠标点击等。