1

我正在尝试创建一个手动滚动器,当您在 JPanel 上拖动鼠标时它会滚动。到目前为止,我无法改变看法。这是我的代码:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class HandScroller extends JFrame {

    public static void main(String[] args) {
        new HandScroller();
    }

    public HandScroller() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);


        final JPanel background = new JPanel();
        background.add(new JLabel("Hand"));
        background.add(new JLabel("Scroller"));
        background.add(new JLabel("Test"));
        background.add(new JLabel("Click"));
        background.add(new JLabel("To"));
        background.add(new JLabel("Scroll"));

        final JScrollPane scrollPane = new JScrollPane(background);

        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                JViewport viewPort = scrollPane.getViewport();
                Point vpp = viewPort.getViewPosition();
                vpp.translate(10, 10);
                background.scrollRectToVisible(new Rectangle(vpp, viewPort.getSize()));
            }
        };

        scrollPane.getViewport().addMouseListener(mouseAdapter);
        scrollPane.getViewport().addMouseMotionListener(mouseAdapter);

        setContentPane(scrollPane);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

}

我认为这会将视图在 x 和 y 方向上移动 10 倍,但它根本没有做任何事情。还有什么我应该做的吗?

谢谢。

4

3 回答 3

3

我认为您可以使用此代码向各个方向移动视图

public void mouseDragged(MouseEvent e) {

           JViewport viewPort = scroll.getViewport();
           Point vpp = viewPort.getViewPosition();
           vpp.translate(mouseStartX-e.getX(), mouseStartY-e.getY());
           scrollRectToVisible(new Rectangle(vpp, viewPort.getSize()));

}

public void mousePressed(MouseEvent e) {

    mouseStartX = e.getX();
    mouseStartY = e.getY();

}
于 2015-07-28T19:35:13.310 回答
2

您的代码确实有效。简单地说,没有什么可以滚动的,因为窗口足够大(实际上,pack()已经导致 JFrame 调整大小以适应其子组件的首选大小和布局

例如,删除pack();并替换该行setSize(60,100);以查看效果。

于 2013-05-04T19:36:48.220 回答
1

这是工作。但是,当您运行此代码时,它JScrollPane会变得足够大以容纳您的所有项目。添加(例如)

scrollPane.setPreferredSize(new Dimension(50, 50));

你会看到你的鼠标事件工作正常。

于 2013-05-04T19:35:44.980 回答