【问题标题】:jSlider go to clicked position - problem only on MacintoshjSlider 转到单击位置 - 仅在 Macintosh 上存在问题
【发布时间】:2011-06-04 13:28:34
【问题描述】:

我一直在为我的所有 JSlider 使用上述 MetalSliderUI 解决方案。 Windows 用户对此感到满意。我很高兴在 stackoverflow.com 上找到这个解决方案 这里讨论了解决方案: JSlider question: Position after leftclick

最近一个 MAC OSX/64 位用户尝试使用我的软件,他从 MetalSliderUI 引用中得到空指针异常。

我添加到 JFrame 构造函数的代码示例:

// Radio Window Elecraft K3 RFPWR Slider - when click on slider
            // go to the value instead of going up/down one tick.
            jSliderElecraftK3RFPWR.setUI(
                new MetalSliderUI() {
                    protected void scrollDueToClickInTrack(int direction) {
                        int value = jSliderElecraftK3RFPWR.getValue();
                        if (jSliderElecraftK3RFPWR.getOrientation() == JSlider.HORIZONTAL) {
                            value = this.valueForXPosition(jSliderElecraftK3RFPWR.getMousePosition().x);
                        } else if (jSliderElecraftK3RFPWR.getOrientation() == JSlider.VERTICAL) {
                            value = this.valueForYPosition(jSliderElecraftK3RFPWR.getMousePosition().y);
                        }
                        jSliderElecraftK3RFPWR.setValue(value);
                    }
                }
            );

在我的代码中没有引用确切行的异常:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at 
javax.swing.plaf.metal.MetalSliderUI.installUI(MetalSliderUI.java:92) at 
javax.swing.JComponent.setUI(JComponent.java:662) at 
javax.swing.JSlider.setUI(JSlider.java:300) at 
HamRadioIntegrator_N3ZH.JFrameRadio.(JFrameRadio.java) at 
HamRadioIntegrator_N3ZH.JFrameRadio$550.run(JFrameRadio.java) at
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at 
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:678) at 
java.awt.EventQueue.access$000(EventQueue.java:86) at 
java.awt.EventQueue$1.run(EventQueue.java:639) at 
java.awt.EventQueue$1.run(EventQueue.java:637) at 
java.security.AccessController.doPrivileged(Native Method) at 
java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:648) at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) at 
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) at  
java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

您对解决这个仅在 Mac 上出现的问题有什么建议吗?

霍华德

【问题讨论】:

  • 您实际上是在 MAC 上使用 Metal LAF,还是只是想在 MAC LAF 上使用 MetalSliderUI?
  • @camickr:从错误来看,我怀疑是后者,正如here所建议的那样。

标签: java macos swing look-and-feel jslider


【解决方案1】:

没有SSCCE 很难说(没有Mac 就更难测试了),但这些问题通常是由于未能在EDT 上更新GUI 造成的。有关详细信息,请参阅 Java 教程的 Concurrency in Swing 课程。

【讨论】:

  • 一个不错的猜测(1+)。我有一种感觉,OP 将很难制作他的 SSCCE,因为看起来用户遇到了错误,而不是 OP,所以他将无法在自己的盒子上重现错误。
  • @HFOE:好点。我错过了代码没有在 Mac 上运行的事实。 OP的。
  • 是的,我在德国有一个 Mac 用户正在使用我的软件。我住在美国,没有 Mac。
【解决方案2】:

问题出在MetalSliderUI 的第92 行,它需要一个名为Slider.trackWidth 的UI 默认值等。该值未出现在com.apple.laf.AquaSliderUI 中。

trackWidth = ((Integer)UIManager.get("Slider.trackWidth")).intValue();

一个简单的替代方法是使用BasicSliderUI。更复杂的方法是初始化 MetalLookAndFeel 并保存对子类的引用以供以后使用。

LookAndFeel save = UIManager.getLookAndFeel();
LookAndFeel laf = new MetalLookAndFeel();
UIManager.setLookAndFeel(laf);
SliderUI mySliderUI = new MetalSliderUI() { ... };
UIManager.setLookAndFeel(save);

【讨论】:

  • 那么,您认为我需要做的就是将“new MetalSliderUI() {”更改为“new BasicSliderUI() {”,它应该可以在 Windows、Linux 和 Mac 上运行?
  • 两种方法都适用于 Mac;这是我尝试过的唯一平台。这是我用来验证异常的example。使用您喜欢的任何一个sscce 更新您的问题。我很乐意在 Mac 上试用它,它可能会吸引一两个 Linux 用户。
  • NO GO - 不能解决问题。最初的问题是我点击了我的滑块,值只移动了 1。
  • stackoverflow 给出了答案——我有一个代码链接。我在几十个地方为我的所有滑块使用了这段代码。效果很好,我单击滑块刻度上的一个值,该值跳到它。但是,它不适用于 MAC。
  • 您的示例代码 - 看起来完全不像我想要的。我尝试使用 SliderUI 而不是 MetalSliderUI - 它不会编译。我很感激你试图帮助我。但我认为您完全错过了我想要做的事情 - 我认为您没有查看原始的 stackoverflow 问题和解决方案。似乎该代码仅适用于 MetalSliderUI。 Java 很棒——编写一次,它只适用于 Windows。嗨
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多