質問

私はJSliderののノブをカスタマイズする必要があります。私はJSliderのデフォルトのノブの上に自分のノブの画像を配置する必要があります。 問題は、現在、2つのノブが反応して来ているということです。一つの私自身のノブと第二既定つまみ。私は、デフォルトのノブまたは他のソリューションを隠すことができる方法を教えてくださいます。

コード以下は

は、そうするために使用されます。

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

 }
}

のおかげで ジョティ

役に立ちましたか?

解決

このように、空白のアイコンで示すUIManagerのSlider.horizontalThumbIconプロパティをオーバーライドし、ノブを非表示にするには:

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

}

他のヒント

UIManagerのソリューションは唯一の私が言うことができるものから金属LAFで動作します。

あなたはUIのbehavourを変更したい場合は、

あなたはUIを変更する必要があります。この場合、あなたはBasicSliderUI(またはそのサブクラスのいずれか)する必要があります。その後、私はあなたがpaintThumb()メソッドをオーバーライドする必要があるだろうと考えています。

このような異なる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) {
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top