如何在获得焦点时从 JSlider 中删除虚线?

How to remove the dotted line from a JSlider when it gets focus?

我需要删除 JSlider 获得焦点时出现在它周围的虚线:

这是我的代码:

private JSlider getSlVolume() {
   if (slVolume == null) {
      slVolume = new JSlider();
      slVolume.addChangeListener(new ChangeListener() { 
         public void stateChanged(ChangeEvent arg0) {
            mP.setVolume(slVolume.getValue(), slVolume.getMaximum());
            txtVol.setText(String.valueOf(slVolume.getValue())); 
         }
      });
      slVolume.setPaintLabels(true);
      slVolume.setPaintTicks(true);
      slVolume.setMinorTickSpacing(10);
      slVolume.setMajorTickSpacing(20);
   }
   return slVolume;
}

我已经尝试按照 here 的建议使用 UIManager.put("Slider.focus", UIManager.get("Slider.background"));,但它对我不起作用。有什么建议吗?

我设法实现它的唯一方法是更改​​其 UI(通过 setUI 方法)和 @Override paintFocus 方法。这取决于您使用的外观和感觉。如果您使用 java 的默认外观和感觉,它将对所有组件使用 BasicUI。所以,为了改变它:

BasicSliderUI sliderUI = new BasicSliderUI(slider) {
    @Override
    public void paintFocus(Graphics g) {
        // dont paint focus
    }
};
slider.setUI(sliderUI);

但是,据我所知,您并不使用这种外观。由于您没有提到您使用的是什么 LAF,我将在 Windows 外观中向您展示如何更改它(您可能会收到 访问限制 使用 class 来自 com.sun.java.swing.plaf.windows 包):

JSlider slider = new JSlider();
WindowsSliderUI s = new WindowsSliderUI(slider) {
    @Override
    public void paintFocus(Graphics g) {
        // dont paint focus
    }
};
slider.setUI(s);