2017-08-30 20 views
0

我正在尝试修改JSlider,以便在点击轨道时出现拇指(旋钮)。我正在修改代码here以实现此目标。基本上,我通过最初将其大小设置为0,0来隐藏拇指。当鼠标点击轨道时,拇指会改变其大小以使其显示。我遇到的问题是曲目也没有出现。但是,一旦点击了曲目,它就会出现。有没有修改拇指(或以某种方式隐藏它)而不改变轨道?任何建议,将不胜感激。使JSlider拇指出现在点击轨道上

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

}

更新:我也试图与paintThumb()类似的办法,但都无济于事。我收到一个空指针异常错误。这里是我的尝试:

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

}

回答

0

以供将来参考,这里有一个简单的解决我的问题:

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