이 정확한 작업을 수행 할 때 JComponent를 서브 클래 싱했습니다. 이유는 Waveform 뷰어 구성 요소는 실제로 컨테이너가 아닙니다. 레이아웃 관리자를 설정하지 않거나 자식을 추가하는 등의 작업을하지 않을 수 있습니다. 어린이, 플래그, 주석 등 특수한 구성 요소가있을 수 있지만 스윙 구성 요소처럼 작동하지는 않습니다. 이 버전을 사용하는 것 외에도 스윙하는 것보다 더 가벼운 구성 요소를 만드는 것이 정말 쉽습니다.
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
}
}
이 대략 어떤 각 오버레이의 구현입니다 :
내 구성 요소는이 같은 근무 등 1 개 이상의 선택, 루프 포인트, 플래그, 플레이 헤드 : 사실 나는 그 개념의 대부분을했습니다. 이벤트 디스패치, 리스닝 등을 처리하는 여러 가지 다른 방법이 있습니다. 선택 항목, 플래그, 재생 헤드, 주석은 모두 WaveformOverlay를 구현합니다. AudioView.paintComponent() 메서드 내에서 보이는 부분의 각 오버레이에 드로잉의 일부를 위임합니다. 내가, 내가 이미 선택 모델에서 구현이 bocause를 시작하고 선택의 끝 찾는 방법을 알고
같은 개념 등 마우스 모션 이벤트, 마우스 클릭, 적용됩니다. 문제는 스윙 구성 요소를 사용해야한다는 것을 알지 못한다는 것입니다. 나는 기존 JPanels에 대해 다른 레이어를 만드는 법을 모릅니다. 저는 웹 개발자입니다. Z- 인덱스가 더 높은 다른 div로 생각합니다.). – ciembor