How to hide jSlider handle?

I need to configure the JSlider knob. I need to put my own handle image above the default Jslider button. The problem is that at present, two pens come in response. One is my pen and the second is the default pen. Please tell me how I can hide the default pen or any other solution.

To do this, use the code below.

public class ImageTest { JSlider slider; JLabel label; public ImageTest() { JPanel panel = new BackgroundPanel(); slider = new BackgroundSlider(); slider.setMaximum(300); slider.setMinimum(0); slider.setValue(50); slider.setExtent(10); slider.addChangeListener(new MyChangeAction()); label = new JLabel("50"); panel.setLayout(new GridBagLayout()); panel.setSize(797,402); slider.setOpaque(false); slider.setPaintTrack(false); label.setOpaque(false); slider.setPreferredSize(new Dimension(340, 20)); GridBagConstraints gridBagConstraintsSlider = new GridBagConstraints(); gridBagConstraintsSlider.gridy = 0; gridBagConstraintsSlider.gridx = 0; gridBagConstraintsSlider.fill = GridBagConstraints.HORIZONTAL; gridBagConstraintsSlider.insets = new Insets(0, 283, 260, 0); GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridy = 0; gridBagConstraints.gridx = 1; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new Insets(0, 50, 240, 0); panel.add(slider, gridBagConstraintsSlider); panel.add(label, gridBagConstraints); JFrame frame = new JFrame(); frame.getContentPane().add(panel); frame.setSize(797,402); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); WindowUtil.locateCenter(frame); } public static void main(String[] args) { ImageTest im= new ImageTest(); } public class MyChangeAction implements ChangeListener{ public void stateChanged(ChangeEvent ce){ int value = slider.getValue(); String str = Integer.toString(value); label.setText(str); if(value==300) { label.setText("Max"); } } } } class BackgroundSlider extends JSlider { Image image; public BackgroundSlider() { try { image = javax.imageio.ImageIO.read(new File("slider.png")); } catch (Exception e) { /*handled in paintComponent()*/ } } protected void paintComponent(Graphics g) { super.paintComponent(g); if (image != null) g.drawImage(image, this.getValue(),(int)this.getAlignmentY(),10,20,this); g.setColor(Color.RED); //draw a centered horizontal line g.drawRect(15,this.getHeight()-1,this.getValue(),this.getHeight()+2); g.fillRect(15,this.getHeight()-1,this.getValue(),this.getHeight()+2); } } 

Thanks Jyoti

+2
source share
3 answers

To hide the handle, override the UIManager Slider.horizontalThumbIcon property with Slider.horizontalThumbIcon empty icon, for example:

 public static void main(String[] args) throws Exception { UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon",new Icon(){ @Override public int getIconHeight() { return 0; } @Override public int getIconWidth() { return 0; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { //do nothing } }); JFrame f = new JFrame(); JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 30, 15); slider.setMajorTickSpacing(10); slider.setMinorTickSpacing(1); slider.setPaintTicks(true); slider.setPaintLabels(true); f.add(slider); f.setSize(200,200); f.setVisible(true); } 
+2
source

The UIManager solution only works in Metal LAF from what I can say.

If you want to change the user interface behavior, you need to change the user interface. In this case, you will need BasicSliderUI (or one of its subclasses). Then I believe that you need to override the paintThumb () method.

+1
source

The solution with another BasicSliderUI is as follows:

 public class SuperSlider extends JSlider { public SuperSlider(int min, int max, int value) { super(min,max,value); setUI(new SuperSliderUI(this)); } private class SuperSliderUI extends BasicSliderUI { @Override public void paintThumb(Graphics g) { } } } 
+1
source

All Articles