2011-08-31 3 views
3

오디오 편집기에서 작업 중입니다. 각 파형은 자체 JPanel에 그려집니다. 이러한 JPanel은 파형 및 타임 라인의 컨테이너 인 다른 JPanel 내부에 있습니다. 그리고이 컨테이너는 JScrollPane에 있습니다.스윙에서 오디오 파형 선택

이제 Selection 클래스에 대한보기를 작성해야하며 어떤 스윙 구성 요소가 가장 좋을지 모르겠다. 선택은 (또는 모든 컨테이너)의 (또는 모든 컨테이너)을 그려야하며, 꽤 투명이어야합니다.은 시간 축을 따라 (조절할 수없고 드래그 가능)으로 드래그 할 수 있어야합니다.

어떻게 하시겠습니까?

답변

2

질문 : 질문 : Finding local Minimum 대답은 파형의 선택을 끌기위한 방법을 제안 할 수 있습니다.

부록 : z을 주문하려면 layered pane을 고려하십시오.

+0

같은 개념 등 마우스 모션 이벤트, 마우스 클릭, 적용됩니다. 문제는 스윙 구성 요소를 사용해야한다는 것을 알지 못한다는 것입니다. 나는 기존 JPanels에 대해 다른 레이어를 만드는 법을 모릅니다. 저는 웹 개발자입니다. Z- 인덱스가 더 높은 다른 div로 생각합니다.). – ciembor

4

이 정확한 작업을 수행 할 때 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를 시작하고 선택의 끝 찾는 방법을 알고