2016-06-01 9 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); 
} 

의 페인트 방법을 덮어했지만, 이미지가 슬라이더보다 높은, 그래서 나의 다음 시도 내가 가진 JLabel의 위의 JSlider에 넣어의 JLayeredPane이었다 영상. 첫 순간은 좋아 보인다. 그러나 나는 슬라이더 전체가 아니라 트랙 뒤에 이미지가 필요하다고 언급했다. 왼쪽과 오른쪽에 공간이 있습니다. 아무도 나에게이 공간을 계산하는 방법을 말해 줄 수 있습니까? 또는 트랙의 슬라이더 경계까지의 너비와 간격? 이것은 Windows와 MacOS에서 실행되어야합니다. 따라서 LookAndFeels가 다르기 때문에 하드 코딩 된 값이 작동하지 않을 것이라고 생각합니다. Example Slider with background image

고마워요.

답변

0

이 문제에 대한 해결책은 이제 SliderUI를 덮어 쓰는 것입니다. 이것은 매우 특별한 구성 요소이므로 모든 LookAndFeels에서 동일하게 보입니다. 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; 
    } 
} 

작품, 어쩌면 모든 장래성을 포함합니다.