JSpinner не реагирует на MouseWheelEvent в Windows

Это сбивает меня с толку: у меня есть небольшое приложение, которое использует JSpinner для числовых значений. Я добавил MouseAdapter к нему, установка значения в зависимости от результирующего события getScrollAmount() а также getWheelRotation(),

Все работает довольно хорошо, если приложение работает в Linux (Debian Wheezy, Oracle JDK 1.6.0_32). То есть прокрутка колесика мыши, когда JSpinner имеет фокус, работает просто отлично (с помощью GTK LookAndFeel).

Тестирование программного обеспечения в Microsoft Windows показало другое поведение: JSpinner не будет реагировать на движение колесика мыши. LookAndFeelКажется, здесь нет проблем, как я уже пытался MetalLookAndFeel на Linux и Windows.

Любые предложения о том, как заставить этот JSpinner реагировать на MouseWheelEventна обеих ОС?

Спасибо.

1 ответ

Решение

Хм, я не уверен, что может быть не так, но вот код, разработанный для Windows 7, и он отлично работает, так что, возможно, попробуйте на своем и посмотрите, где код отличается:

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

/**
 *
 * @author David
 */
public class JSpinnerMouse extends JFrame {

    private JSpinner jspinner;

    public JSpinnerMouse() {
        createAndShowUI();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JSpinnerMouse jSpinnerMouse = new JSpinnerMouse();
            }
        });
    }

    private void createAndShowUI() {
        setTitle("JSpinner using mouse wheel");
        setSize(300, 300);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        addComponentsToContentPane(getContentPane());
        addListeners();
        setVisible(true);
    }

    private void addComponentsToContentPane(Container contentPane) {
        jspinner = new JSpinner();
        contentPane.add(jspinner);
    }

    private void addListeners() {
        this.addMouseWheelListener(new MouseWheelListener() {

            @Override
            public void mouseWheelMoved(MouseWheelEvent mwe) {
                if (MouseWheelEvent.WHEEL_UNIT_SCROLL == mwe.getScrollType()) {
                    int value = (int) jspinner.getValue();
                    if (mwe.getWheelRotation() == -1) {//up
                        jspinner.setValue(value + 1);
                    } else {//down
                        jspinner.setValue(value - 1);
                    }
                }
            }
        });
    }
}

Кроме того, я не смог найти метод getDirection() в MouseWheelEvent, как вы сказали, что вы используете, поэтому я использовал getUnitsToScroll(), который будет возвращать положительное или отрицательное значение в зависимости от направления. Может быть, это то, что вызывает проблемы. Где вы нашли метод getDirection() в классе MouseWheelEvent?

Другие вопросы по тегам