2016-06-01 20 views
1

我想把一個圖像(音頻的可視化)放在表示音頻播放器的JSlider後面,即播放過程。 首先,我試圖覆蓋的滑塊背後的JSlider圖像

public void paintComponent(Graphics g) { 
    // Draw the previously loaded image to Component 
    g.drawImage(img, 0, -100, null); 
    super.paintComponent(g); 
} 

這個工作的油漆方法,但圖像是比滑塊高,所以我的下一個嘗試是一個JLayeredPane的,在這裏我把JSlider的一個JLabel以上的圖片。第一時間看起來不錯。但我提到我需要滑塊軌道後面的圖像,而不是整個滑塊。有空間左右。任何人都可以告訴我如何計算這個空間?或者軌道的寬度和偏移量到滑塊的邊界?這應該在Windows和MacOs下運行,所以LookAndFeels不同,所以我認爲硬編碼值不起作用。 Example Slider with background image

謝謝。

回答

0

我對這個問題的解決方案是現在覆蓋SliderUI。所以這是一個非常特殊的組件,所以它在所有LookAndFeel上看起來都是一樣的。 它也支持直接跳轉到鼠標位置,這與BasicSliderUI不同。

/** 
* 
* Custom SliderUI for AudioPlayer with audioimage in background 
*/ 
public class AudioSliderUI extends BasicSliderUI { 

    private BasicStroke stroke = new BasicStroke(1f, BasicStroke.CAP_ROUND, 
      BasicStroke.JOIN_ROUND, 0f); 

    public AudioSliderUI(AudioSlider b) { 
     super(b); 
    } 

    @Override 
    public void paint(Graphics g, JComponent c) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     super.paint(g, c); 
    } 

    @Override 
    protected Dimension getThumbSize() { 
     return new Dimension(2, 200); 
    } 

    @Override 
    public void paintTrack(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     Stroke old = g2d.getStroke(); 
     g2d.setStroke(stroke); 
     g2d.setPaint(Color.WHITE); 
     if (slider.getOrientation() == SwingConstants.HORIZONTAL) { 
      g2d.drawLine(trackRect.x, trackRect.y + trackRect.height/2, 
        trackRect.x + trackRect.width, trackRect.y + trackRect.height/2); 
     } else { 
      g2d.drawLine(trackRect.x + trackRect.width/2, trackRect.y, 
        trackRect.x + trackRect.width/2, trackRect.y + trackRect.height); 
     } 
     g2d.setStroke(old); 
     Image img = ((AudioSlider)slider).getImage(); 
     g2d.drawImage(img, trackRect.x, trackRect.y, trackRect.width, trackRect.height, slider); 

    } 

    @Override 
    public void paintThumb(Graphics g) { 
     Rectangle knobBounds = thumbRect; 
     int w = knobBounds.width; 
     int h = 100; 
     int newStarty = knobBounds.height/2- h/2; 
     g.translate(knobBounds.x, knobBounds.y); 

     //  "plain" version 
     g.setColor(Color.YELLOW); 
     g.fillRect(0, newStarty, w, h); 

    } 

    @Override 
    protected TrackListener createTrackListener(JSlider slider) { 
     return new TrackListener() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if (UIManager.getBoolean("Slider.onlyLeftMouseButtonDrag") 
         && SwingUtilities.isLeftMouseButton(e)) { 
        JSlider slider = (JSlider) e.getComponent(); 
        switch (slider.getOrientation()) { 
        case SwingConstants.VERTICAL: 
         slider.setValue(valueForYPosition(e.getY())); 
         break; 
        case SwingConstants.HORIZONTAL: 
         slider.setValue(valueForXPosition(e.getX())); 
         break; 
        default: 
         throw new IllegalArgumentException(
           "orientation must be one of: VERTICAL, HORIZONTAL"); 
        } 
        super.mousePressed(e); // isDragging = true; 
        super.mouseDragged(e); 
       } else { 
        super.mousePressed(e); 
       } 
      } 

      @Override 
      public boolean shouldScroll(int direction) { 
       return false; 
      } 
     }; 
    } 
} 

配套滑塊:

public class AudioSlider extends JSlider { 

    private Image img; 

    public AudioSlider() { 
     setOpaque(false); 
    } 

    /** 
    * @return the img 
    */ 
    public Image getImage() { 
     return img; 
    } 

    public void setImage(Image img) { 
     this.img = img; 
    } 
} 

工作對我來說,也許涵蓋並非所有的前景。