2017-08-30 29 views
0

J'essaie de modifier un JSlider de sorte que le pouce (bouton) apparaît en cliquant sur la piste. J'adapte le code trouvé here pour atteindre cet objectif. Essentiellement, je cache le pouce en initialisant sa taille à 0,0. Lorsque la souris clique sur la piste, le pouce change sa taille pour qu'il apparaisse. Le problème que j'ai rencontré est que la piste n'apparaît pas non plus. Cependant, il apparaît une fois que la piste est cliquée. Y at-il loin de modifier le pouce (ou le cacher en quelque sorte) sans modifier la piste? Toute suggestion serait appréciée.Faire apparaître JSlider thumb en cliquant sur la piste

public class SliderUI extends MetalSliderUI { 
private boolean displayThumb = false; 
private int x = 0; 
private int y = 0; 

public SliderUI(){ 
    super(); 
} 


@Override 
protected Dimension getThumbSize() { 
    return new Dimension(x, y); 
} 

@Override 
protected void scrollDueToClickInTrack(int direction) { 

    //keep displaying thumb once true 
    if(!displayThumb){ 
     x = 15; 
     y = 20; 
     displayThumb = true; 
    } 
    int value = slider.getValue(); 
    if (slider.getOrientation() == JSlider.HORIZONTAL) { 
     value = this.valueForXPosition(slider.getMousePosition().x); 
    } else if (slider.getOrientation() == JSlider.VERTICAL) { 
     value = this.valueForYPosition(slider.getMousePosition().y); 
    } 
    slider.setValue(value); 
} 

}

Mise à jour: J'ai essayé aussi une approche similaire avec paintThumb(), mais en vain. J'ai reçu une erreur d'exception de pointeur null. Voici ce que j'ai essayé:

public class SliderUI extends MetalSliderUI { 
private boolean displayThumb = false; 
protected static Icon horizThumbIcon; 
protected static Icon vertThumbIcon; 
private static Icon SAFE_HORIZ_THUMB_ICON; 
private static Icon SAFE_VERT_THUMB_ICON; 

public SliderUI(){ 
    super(); 
} 

private static Icon getHorizThumbIcon() { 
    if (System.getSecurityManager() != null) { 
     return SAFE_HORIZ_THUMB_ICON; 
    } else { 
     return horizThumbIcon; 
    } 
} 

private static Icon getVertThumbIcon() { 
    if (System.getSecurityManager() != null) { 
     return SAFE_VERT_THUMB_ICON; 
    } else { 
     return vertThumbIcon; 
    } 
} 


@Override 
public void paintThumb(Graphics g) { 
     //keep displaying thumb once true 
     if(!displayThumb){ 
      displayThumb = true; 
      return; 
     } 
    Rectangle knobBounds = thumbRect; 

    g.translate(knobBounds.x, knobBounds.y); 

    if (slider.getOrientation() == JSlider.HORIZONTAL) { 
     getHorizThumbIcon().paintIcon(slider, g, 0, 0); 
    } 
    else { 
     getVertThumbIcon().paintIcon(slider, g, 0, 0); 
    } 

    g.translate(-knobBounds.x, -knobBounds.y); 
} 

@Override 
protected void scrollDueToClickInTrack(int direction) { 


    int value = slider.getValue(); 
    if (slider.getOrientation() == JSlider.HORIZONTAL) { 
     value = this.valueForXPosition(slider.getMousePosition().x); 
    } else if (slider.getOrientation() == JSlider.VERTICAL) { 
     value = this.valueForYPosition(slider.getMousePosition().y); 
    } 
    slider.setValue(value); 
} 

}

Répondre

0

Pour référence ultérieure, voici une solution simple à ma question:

public class SliderUI extends MetalSliderUI { 

    private boolean displayThumb = false; 

    public SliderUI(){ 
     super(); 
    } 


    @Override 
    public void paintThumb(Graphics g) { 
     if(displayThumb){ 
      super.paintThumb(g); 
     } 
    } 

    @Override 
    protected void scrollDueToClickInTrack(int direction) { 
     //keep displaying thumb once true 
     if(!displayThumb){ 
      displayThumb = true; 
     } 
     int value = slider.getValue(); 
     if (slider.getOrientation() == JSlider.HORIZONTAL) { 
      value = this.valueForXPosition(slider.getMousePosition().x); 
     } else if (slider.getOrientation() == JSlider.VERTICAL) { 
      value = this.valueForYPosition(slider.getMousePosition().y); 
     } 
     slider.setValue(value); 
    } 
}