MouseWheelListener в JSpinner JAVA

Пожалуйста, смотрите мой код ниже. Что я хочу, так это то, что во время события с колесом мыши он прокручивает список, установленный в моей спиннер-модели, но не может этого сделать. Можете ли вы помочь мне, какой код подходит для события mousewheel?

    JSpinner lines = new JSpinner();
    lines.addMouseWheelListener(new MouseWheelListener() {
        public void mouseWheelMoved(MouseWheelEvent e) {
            lines.setValue(new Integer((Integer)lines.getValue()).intValue() - e.getWheelRotation());
        }
    });
    lines.setFont(new Font("Tahoma", Font.BOLD, 12));
    lines.setModel(new SpinnerListModel(new String[] {"P5", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", }));
    lines.setBounds(63, 11, 49, 35);
    frmHistoryRequest.getContentPane().add(lines);

Это ошибка, которую я получил, когда я выполняю свою программу

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String не может быть приведено к java.lang.Integer.

Я все еще новичок в программировании на Java, и у меня есть чему поучиться.. Спасибо тем, кто поможет.

2 ответа

Решение

Вы получаете ClassCastException, потому что ваш код пытается установить текущее значение модели в Integer, если ваша модель состоит только из строк.

Следующий фрагмент кода должен правильно установить текущее значение модели, используя следующие и предыдущие значения из вашей модели.

lines.addMouseWheelListener(new MouseWheelListener() {
    public void mouseWheelMoved(MouseWheelEvent e) {
        int positiveWheelRotation = Math.abs(e.getWheelRotation());
        Object value = null;
        for(int i=0;i<positiveWheelRotation;i++) {
            if(e.getWheelRotation() > 0) 
                value = lines.getNextValue();
            else if(e.getWheelRotation() < 0)
                value = lines.getPreviousValue();
        }
        if(value != null)
            lines.setValue(value);
    }
});

setValue() это не индекс SpinnerListModel, а точнее фактическое значение индекса в SpinnerListModel, Означающий, что getValue() вернет либо "P5", "D1", "D2", "D3"... Вместо того, где они находятся внутри массива.

Я сделал рабочий пример, который использует getPreviousValue() а также getNextValue():

JSpinner lines = new JSpinner();
lines.addMouseWheelListener(new MouseWheelListener() {
    public void mouseWheelMoved(MouseWheelEvent e) {
        int direction = e.getWheelRotation();
        if (direction > 0 && lines.getPreviousValue() != null){ // down
            lines.setValue(lines.getPreviousValue());
        } else if (direction < 0 && lines.getNextValue() != null){ // up
            lines.setValue(lines.getNextValue());
        }
    }
});
Другие вопросы по тегам