2016-06-01 17 views
1

Ich möchte ein Bild (Visualisierung eines Audio) setzen hinter dem JSlider, die den Audioplayer darstellt, um den Prozess des Spielens. Zuerst habe ich versucht, die Farbe-Methode des SliderJSlider Bild hinter Spur

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

das funktionierte überschreiben, aber das Bild ist höher als der Schieber, so dass meine nächsten Versuch war ein JLayeredPane, wo ich die JSlider mit der über einem JLabel setzen Bild. Sieht gut für den ersten Moment aus. Aber ich erwähnte, dass ich das Bild hinter der Spur des Schiebers, nicht der ganze Schieber. Links und rechts ist Platz. Kann mir jemand sagen, wie man diesen Raum berechnet? Oder die Breite und den Versatz der Spur zum Rand des Schiebers? Dies sollte unter Windows und Mac OS laufen, so verschieden LookAndFeels, also denke ich hart codierte Werte werden nicht funktionieren. Example Slider with background image

Thankyou.

Antwort

0

für dieses Problem Meine Lösung ist nun die SliderUI zu überschreiben. Das ist also eine sehr spezielle Komponente, daher ist es nicht relevant, dass es auf allen LookAndFeels gleich aussieht. Es unterstützt auch direkt an der Mausposition springen, die BasicSliderUI unterscheidet.

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

Slider Passende:

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 für mich, deckt vielleicht nicht alle Interessenten.