如何在Java AWT ScrollPane中使用触控板进行水平滚动?

6
许多现代的鼠标和触摸板都支持垂直和水平滚动。一旦你习惯了这个功能,就会上瘾。我希望我的Java应用程序能够通过触摸板/鼠标滚轮支持水平滚动,但是无论我在哪里搜索,似乎Java不支持这个功能。我真的希望有人告诉我我做错了什么,这个功能已经被请求:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440198。不能做到这件简单的事情实际上会成为我正在开发的应用程序的绊脚石。事实上,对于我能想象到的任何应用程序都是如此!我已经在Java后端投入了一些时间,所以我真的很想找到一个解决这个看似简单的问题的方法。问题是我该怎么实现这个行为?Java是否向我公开了原始操作系统级别的事件,那么我是否需要从头开始编写?
import java.awt.*;

public class ScrollExample extends Canvas {

    public void paint(Graphics g) {

        g.setColor(Color.green);
        g.fillOval(0,0,400, 400);

    }

    public static void main(String[] args) {

        ScrollExample b = new ScrollExample();
        Frame f = new Frame ("Scroll Example");

        ScrollPane scroller = new ScrollPane (ScrollPane.SCROLLBARS_ALWAYS);
        scroller.add(b,"Center");
        f.setPreferredSize(new Dimension(500,500));
        f.add ("Center",scroller);
        f.pack();
        f.show();

    }

}

Swing示例适用于水平和垂直滚动

import java.awt.*;
import javax.swing.*;

public class ScrollExample extends JPanel { 

    public void paint(Graphics g) {

        super.paint(g);

        g.setColor(Color.green);
        g.fillOval(0,0,400, 400);

    }

    public static void main(String[] args) {

        JFrame f = new JFrame ("Scroll Example");
        ScrollExample p = new ScrollExample();
        p.setPreferredSize(new Dimension(1000, 1000));

        JScrollPane scroller = new JScrollPane(p,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scroller.getHorizontalScrollBar().setUnitIncrement(10);
        scroller.getVerticalScrollBar().setUnitIncrement(10);

        f.setPreferredSize(new Dimension(500,500));
        f.add (scroller,BorderLayout.CENTER);
        f.pack();
        f.show();
    }
}
2个回答

1

尽管在Swing中默认支持此功能,但当两个滚动条都可见时,垂直滚动优先于水平滚动。

我希望新的开发工作能够在Swing而不是AWT中完成。

编辑:

您应该能够使用鼠标滚轮控制器来自定义滚动速度。我从未尝试过水平滚动,请告诉我它是否有效。


谢谢,Swing 虽然比 AWT 慢,但可能只是轮子的默认配置。我原本真的想使用 AWT 来控制操作系统,但现在我会转而使用 Swing,因为我大部分的用户界面都会被覆盖。 - blissapp
关于滚动速度慢的评论,请参见我上面的编辑。 - camickr
谢谢更新。我尝试了那个鼠标滚轮控制器类,但它使得我的硬件滚动变得缓慢和卡顿。我的最终解决方案是在滚动条本身上使用setUnitIncrement()方法,我已经将详细信息添加到上面的代码中。 - blissapp

1
我的MacBookPro触摸板上的导航事件可以直接处理。请注意,JScrollPane上有一个方法可以启用滚轮事件:setWheelScrollingEnabled

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接