Когда я сделал именно это, я создал подкласс 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() делегирует часть своего рисунка каждому наложению в видимом представлении.
Та же концепция применяется к событиям движения мыши, щелчкам мыши и т. д.
person
chubbsondubs
schedule
31.08.2011