Как спрятать ручку jSlider? - PullRequest
       1

Как спрятать ручку jSlider?

2 голосов
/ 26 октября 2010

Мне нужно настроить ручку JSlider. Мне нужно поместить изображение моей собственной кнопки поверх стандартной кнопки Jslider. Проблема в том, что в настоящее время в ответ приходят две ручки. Один мой собственный регулятор и второй регулятор по умолчанию. Скажите, пожалуйста, как я могу скрыть ручку по умолчанию или любое другое решение?

Для этого используется код ниже.

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

 }
}

Спасибо Джиоти

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

Чтобы скрыть ручку, переопределите свойство Slider.horizontalThumbIcon UIManager пустым значком, например:

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

}
1 голос
/ 07 ноября 2012

Решение с другим BasicSliderUI выглядит следующим образом:

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 голос
/ 26 октября 2010

Решение UIManager работает только в Metal LAF, насколько я могу судить.

Если вы хотите изменить поведение пользовательского интерфейса, вам нужно изменить пользовательский интерфейс. В этом случае вам потребуется BasicSliderUI (или один из его подклассов). Тогда я считаю, что вам нужно переопределить метод paintThumb ().

...