2011-08-31 113 views
3

我正在使用音頻編輯器。每個波形都在自己的JPanel中繪製。那些JPanel在另一個JPanel中,這是一個波形和時間線的容器。此容器位於JScrollPane中。Swing中的音頻波形選擇

現在我必須爲Selection類編寫視圖,我不知道哪個Swing組件最好。選擇波形(或所有容器),應該是相當透明應可拖動(不可調整大小,只是可拖動)沿時間軸。

你會怎麼做?

回答

2

問題&答案Finding local Minimum可能會提示拖動波形選區的方法。

附錄:要生效z - 訂購,請考慮layered pane

+0

我知道如何找到啓動和選擇的結束,bocause我已經擁有它的選擇模型來實現。問題是,我不知道我應該使用什麼揮杆組件。我不知道如何在現有JPanel上創建另一個圖層。我是一個web開發者,我認爲它是z-index較高的另一個div;)。 – ciembor

4

當我做了這個確切的事情,我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()方法內部將其繪圖的一部分委託給可見視圖內的每個疊加層。

相同的概念適用於鼠標移動事件,鼠標點擊等