簡體   English   中英

jSlider go 點擊 position - 僅在 Macintosh 上存在問題

[英]jSlider go to clicked position - problem only on Macintosh

我一直在為我的所有 JSlider 使用上述 MetalSliderUI 解決方案。 Windows 用戶對它很滿意。 我很高興在 stackoverflow 上找到此解決方案。com 此處討論了該解決方案: JSlider question: Position after leftclick

現在最近一個 MAC OSX/64 位用戶正在嘗試使用我的軟件,他從 MetalSliderUI 引用中得到了 null 指針異常。

我添加到 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 上發生的此問題有什么建議嗎?

霍華德

沒有SSCCE很難說(沒有 Mac 就更難測試了),但這些問題通常是由於未能在 EDT 上更新 GUI 造成的。 有關詳細信息,請參閱 Java 教程的Swing課程中的並發。

問題出在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM