jSlider перейти в положение щелчка - проблема только на Macintosh - PullRequest
3 голосов
/ 04 июня 2011

Я использую вышеуказанное решение MetalSliderUI для всех моих JSliders. Пользователи Windows были счастливы с этим. Я ценю поиск этого решения на stackoverflow.com Решение обсуждалось здесь: JSlider question: Позиция после щелчка левой кнопкой мыши

В настоящее время пользователь MAC OSX / 64bit пытается использовать мое программное обеспечение, и он получает исключения нулевого указателя из ссылок 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?

Говард

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Проблема в строке 92 из MetalSliderUI, которая, среди прочего, требует значения по умолчанию пользовательского интерфейса с именем 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);
1 голос
/ 04 июня 2011

Трудно сказать без SSCCE (еще сложнее без Mac. Тестировать с), но эти проблемы часто возникают из-за неудачного обновления GUI на EDT. См. Урок Параллельность в Swing Учебника Java для получения более подробной информации.

...