Java - 用鼠标滚轮滚动和缩放?

标签 java netbeans scroll zooming mousewheel

我正在 netbeans 中开发一个桌面应用程序,其中有一个编辑器类,它是具有 JScrollPane 的类的子类。 (JScrollPane 有两个 JScrollBar:水平和垂直。)一切都按预期工作,包括能够使用鼠标滚轮垂直(无修饰符)和水平(通过使用移位修饰符)。 另一个父类(super class)(在我的类和 JScrollPane 类之间)实现缩放(通过菜单命令设置我的缩放(比例)系数,可以正常工作(包括滚动))。 我想要的是当 alt(选项)键按下(isAltDown() 为 true)时能够通过鼠标滚轮放大/缩小,否则回退到默认滚动(H&V)行为。这是我的类(class)设置代码的一部分:

            JScrollPane scrollPane = getPanelScrollPane();
            JScrollBar hsb = scrollPane.getHorizontalScrollBar();
            JScrollBar vsb = scrollPane.getVerticalScrollBar();

            MouseWheelListener mwl = new MouseWheelListener() {
                @Override
                public void mouseWheelMoved(MouseWheelEvent e) {
                    if (e.isAltDown()) {
                        double oldZoom = getZoom();
                        double amount = Math.pow(1.1, e.getScrollAmount());
                        if (e.getWheelRotation() > 0) {
                            //zoom in (amount)
                            setZoom(oldZoom * amount);
                        } else {
                            //zoom out (amount)
                            setZoom(oldZoom / amount);
                        }
                    } else {
                        // pass the event on to the scroll pane
                        getParent().dispatchEvent(e);
                    }
                }
            };

            // add mouse-wheel support
            hsb.addMouseWheelListener(mwl);
            vsb.addMouseWheelListener(mwl);

此设置代码正在被调用,但当我移动鼠标滚轮时(当光标位于我的 View 上时),永远不会调用 mouseWheelMoved 方法; View 继续正常滚动(水平和垂直)。

我还尝试向我的类添加“implements MouseWheelListener”和 mouseWheelMoved 方法:

@Override
public void mouseWheelMoved(MouseWheelEvent e) {
    // (same as mouseWheelMoved above)
}

还是没有运气……我错过了什么? (编辑:删除了有关传播轮子事件的额外问题:在此回答:< How to implement MouseWheelListener for JPanel without breaking its default implementation? >)。

最佳答案

弄清楚了......设置代码应该是:

    // add mouse-wheel support
    JScrollPane scrollPane = getPanelScrollPane();
    scrollPane.addMouseWheelListener(this);

然后将 implements MouseWheelListener 和这个 mouseWheelMoved 方法添加到我的类中:

 @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        if (e.isAltDown()) {
            double oldZoom = getZoom();
            double amount = Math.pow(1.1, e.getScrollAmount());
            if (e.getWheelRotation() > 0) {
                //zoom in (amount)
                setZoom(oldZoom * amount);
            } else {
                //zoom out (amount)
                setZoom(oldZoom / amount);
            }
        } else {
            // if alt isn't down then propagate event to scrollPane
            JScrollPane scrollPane = getPanelScrollPane();
            scrollPane.getParent().dispatchEvent(e);
        }
    }

现在一切正常了!按下 alt(选项)鼠标滚轮可放大/缩小,不按下则面板滚动!

关于Java - 用鼠标滚轮滚动和缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44092225/

相关文章:

java - 如何使对象全局可供其他类使用

java - 为了得到一个类对象,我们使用 MyClass.class - 看起来 “class” 是 “MyClass” 的静态成员

java - 为一台计算机系统设置 Java 应用程序

java - 在 NetBeans 中设置类路径

android - 带偏移量的 RecyclerView 滚动速度

javascript - 仅在必要时水平滚动

java - MalformedURLException 错误

java - 带有自签名证书的 egit,https

java - 如何拦截进入 Java Swing JTextField 的键盘敲击?

javascript - 滚动页面时如何更快地移动 1 div/越过 div