2016-06-01 34 views
1

Je veux mettre une image (visualisation d'un audio) derrière le JSlider qui représente l'audiopleur, le processus de lecture. Tout d'abord j'ai essayé de remplacer la peinture méthode du curseurJSlider image derrière la piste

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

cela a fonctionné, mais l'image est plus élevé que le curseur, donc mon prochain essai était un JLayeredPane, où je mets le JSlider au-dessus d'un JLabel avec le image. On dirait bien pour le premier moment. Mais j'ai mentionné que j'ai besoin de l'image derrière la piste du curseur, pas tout le curseur. Il y a de l'espace à gauche et à droite. Quelqu'un peut-il me dire un moyen de calculer cet espace? Ou la largeur et le décalage de la piste à la frontière du curseur? Cela devrait fonctionner sous Windows et MacOs, si différents LookAndFeels, donc je pense que les valeurs codées ne fonctionneront pas. Example Slider with background image

Merci.

Répondre

0

Ma solution pour ce problème est maintenant d'écraser le SliderUI. Il s'agit donc d'un composant très spécial, il n'est donc pas important qu'il soit identique sur tous les LookAndFeels. Il prend également en charge le saut directement à la position de la souris, ce qui est différent de 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; 
      } 
     }; 
    } 
} 

assortis Curseur:

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; 
    } 
} 

Works pour moi, couvre peut-être pas toutes les perspectives.