【问题标题】:How to remove the dotted line from a JSlider when it gets focus?获得焦点时如何从JSlider中删除虚线?
【发布时间】:2019-11-30 18:11:01
【问题描述】:

当我的 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"));,但它对我不起作用。有什么建议吗?

【问题讨论】:

  • 你为什么要这样做?那条虚线是为了让用户知道哪个组件具有输入焦点没有它,用户不知道哪个组件将接收键盘输入。

标签: java swing jslider


【解决方案1】:

我设法实现它的唯一方法是更改​​其 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 外观中更改它(您可能会收到 访问限制 警告,以使用来自 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);

【讨论】:

  • 我希望滑块仍然可以聚焦,这样就可以用按键而不是鼠标来控制它。
  • @LuisFernandez 我已经编辑了我的答案。我之前的回答是完全错误的。我以为方法是setFocusPainted(),我立即发布了。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2019-11-05
  • 2020-10-26
相关资源
最近更新 更多