我需要自定义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); } }
感谢Jyoti
要隐藏旋钮,请Slider.horizontalThumbIcon使用空白图标覆盖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); }