JSpinner 中的 MouseWheelListener JAVA

MouseWheelListener in JSpinner JAVA

请看下面我的代码。我想要的是在我的鼠标滚轮事件期间它会滚动到我的 spinnermodel 中设置的列表但无法做到这一点。你能帮我什么是鼠标滚轮事件的合适代码吗?

    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 编程方面还是个新手,我还有很多东西要学。感谢那些愿意提供帮助的人。

您收到 ClassCastException,因为当您的模型仅包含字符串时,您的代码试图将模型的当前值设置为整数。

以下代码片段应使用模型中的下一个和上一个值正确设置模型的当前值。

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() 将 return "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());
        }
    }
});