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