我正在使用音頻編輯器。每個波形都在自己的JPanel中繪製。那些JPanel在另一個JPanel中,這是一個波形和時間線的容器。此容器位於JScrollPane中。Swing中的音頻波形選擇
現在我必須爲Selection類編寫視圖,我不知道哪個Swing組件最好。選擇波形(或所有容器),應該是相當透明和應可拖動(不可調整大小,只是可拖動)沿時間軸。
你會怎麼做?
我正在使用音頻編輯器。每個波形都在自己的JPanel中繪製。那些JPanel在另一個JPanel中,這是一個波形和時間線的容器。此容器位於JScrollPane中。Swing中的音頻波形選擇
現在我必須爲Selection類編寫視圖,我不知道哪個Swing組件最好。選擇波形(或所有容器),應該是相當透明和應可拖動(不可調整大小,只是可拖動)沿時間軸。
你會怎麼做?
問題&答案Finding local Minimum可能會提示拖動波形選區的方法。
附錄:要生效z - 訂購,請考慮layered pane。
當我做了這個確切的事情,我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()方法內部將其繪圖的一部分委託給可見視圖內的每個疊加層。
相同的概念適用於鼠標移動事件,鼠標點擊等
我知道如何找到啓動和選擇的結束,bocause我已經擁有它的選擇模型來實現。問題是,我不知道我應該使用什麼揮杆組件。我不知道如何在現有JPanel上創建另一個圖層。我是一個web開發者,我認爲它是z-index較高的另一個div;)。 – ciembor