2011-06-04 168 views
3

我一直在使用上述MetalSliderUI解決方案爲我所有的JSliders。 Windows用戶對此感到滿意。我讚賞stackoverflow.com找到這個解決方案 在這裏討論的解決方法: JSlider question: Position after leftclickjSlider去點擊的位置 - 只有在Macintosh上的問題

現在最近一個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上出現?

霍華德

+0

你實際上是在MAC上使用Metal LAF還是試圖在MAC LAF上使用MetalSliderUI? – camickr 2011-06-04 15:06:54

+0

@camickr:由錯誤判斷,我懷疑後者,因爲建議[這裏](http://stackoverflow.com/questions/6236998/jslider-go-to-clicked-position-problem-only-on-macintosh/ 6238251#6238251)。 – trashgod 2011-06-04 17:27:05

回答

1

這是很難沒有SSCCE說(更難沒有Mac電腦。來測試),但這些問題往往是由於沒有更新的EDT的GUI引起的。有關更多詳細信息,請參閱Java教程的Concurrency in Swing課程。

+0

一個很好的猜測(1+)。我有一種感覺,即OP會因爲看起來用戶正在經歷錯誤而不是OP,因此他將無法在他自己的盒子上重現錯誤,因此OP將會有一段艱難的時間來進行他的SSCCE。 – 2011-06-04 14:29:38

+0

@HFOE:好點。我錯過了代碼沒有在Mac上運行的事實。的OP。 – 2011-06-04 14:47:38

+0

是的,我在德國有一位使用我的軟件的Mac用戶。我住在美國,無法訪問Mac。 – howard 2011-06-04 23:14:01

1

問題出現在MetalSliderUI的第92行,它需要UI默認值Slider.trackWidth等等。該值不會出現在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); 
+0

所以,你認爲我需要做的只是改變「新的MetalSliderUI(){」爲「新的BasicSliderUI(){」,它應該在Windows,Linux和Mac上工作? – howard 2011-06-04 23:17:48

+0

這兩種方法都可以在Mac上使用;這是我嘗試的唯一平臺。這裏是我用來驗證異常的[示例](http://stackoverflow.com/questions/2898023/custom-java-swing-meter-control/2898259#2898259)。用你喜歡的任何一個[sscce](http://sscce.org)更新你的問題。我很樂意在Mac上試用它,它可能會吸引一兩個Linux用戶。 – trashgod 2011-06-05 00:14:41

+0

不行 - 不能解決問題。 – howard 2011-06-05 03:23:44