Java - 如何设置JScrollPane的键盘滚动速度

时间:2011-07-06 23:15:08

标签: java swing

JPanel的{​​{1}}包含另一个JScrollPane或两个JPanel。我的生活取决于使用键盘的方向箭头增加滚动速度。仔细考虑之后,决定:sc.getVerticalScrollBar().setUnitIncrement(240);的权力应该只适用于鼠标,这是一个聪明的诡计,可以引起java开发人员的轻微烦恼。有什么办法可以提高滚动速度吗?我的生活在于平衡。

3 个答案:

答案 0 :(得分:4)

您必须使用InputMap.putActionMap.put的组合来捕获JScrollPane中包含的组件的键盘事件,并在JScrollPane拥有时处理键盘事件焦点。由于滚动的默认增量值为1,因此您应该将所需的增量值添加或减去JScrollPane滚动条的当前值,您可以使用JScrollPane.getVerticalScrollBar().getValue()获取并使用JScrollPane.getVerticalScrollBar().setValue(int). <设置/ p>

使用此代码可以使用JScrollPane捕获包含元素的事件的示例,我已经完成了按钮,但是您明白了这一点(对于错误的代码组织抱歉):

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

public class Test
{
    public static void main(String[] args)
    {
        final JFrame f = new JFrame("");
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2000,1));


        for(int  i = 0; i != 2000; i++)
        {
            JButton btn = new JButton("Button 2");
            panel.add(btn);
        }
        final JScrollPane sPane = new JScrollPane(panel);
        final int increment = 5000;
        sPane.getVerticalScrollBar().setUnitIncrement(increment);

        KeyStroke kUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
        KeyStroke kDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);

        sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp");
        sPane.getActionMap().put("actionWhenKeyUp",
            new AbstractAction("keyUpAction")
            {
                public void actionPerformed(ActionEvent e)
                {
                    final JScrollBar bar = sPane.getVerticalScrollBar();
                    int currentValue = bar.getValue();
                    bar.setValue(currentValue - increment);
                }
            }
        );

        sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kDown,"actionWhenKeyDown");
        sPane.getActionMap().put("actionWhenKeyDown",
            new AbstractAction("keyDownAction")
            {
                public void actionPerformed(ActionEvent e)
                {
                    final JScrollBar bar = sPane.getVerticalScrollBar();
                    int currentValue = bar.getValue();
                    bar.setValue(currentValue + increment);
                }
            }
        );
        f.add(sPane);
        f.pack();



        SwingUtilities.invokeLater(
                new Runnable()
                {
                    public void run()
                    {
                        f.setVisible(true);
                    }
                }
            );
    }
}

我们注册听取并处理该事件:

sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp");
sPane.getActionMap().put("actionWhenKeyUp",
    new AbstractAction("keyUpAction")
    {
        public void actionPerformed(ActionEvent e)
        {
            final JScrollBar bar = sPane.getVerticalScrollBar();
            int currentValue = bar.getValue();
            bar.setValue(currentValue - increment);
        }
    }
);

执行JScrollBar增量值的键代码是AbstractAction(在这种情况下,当用户按下向上键时)。

        public void actionPerformed(ActionEvent e)
        {
            final JScrollBar bar = sPane.getVerticalScrollBar();
            int currentValue = bar.getValue();
            bar.setValue(currentValue - increment);
        }

当您的JScrollPane具有焦点时,您应该做的是完成事件,但这应该是微不足道的。

希望有助于挽救你的生命:P或至少以你为出发点。

答案 1 :(得分:2)

可能不是您要找的东西,但是在使用鼠标时可以使用Mouse Wheel Controller加快滚动速度。

  

我的生活取决于使用键盘的方向箭头来提高滚动速度。

不确定在使用键盘时如何让滚动窗格滚动。当我使用键盘箭头时,我无法滚动滚动窗格。发布展示问题的SSCCE

编辑:

对于我的简单测试,我只是在滚动窗格中添加了一个JLabel。由于默认情况下JLabel不可聚焦,因此滚动窗格中的任何组件都没有焦点,因此滚动条的默认操作不会被调用。通过使标签可聚焦,键盘滚动起作用。

答案 2 :(得分:0)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.event.MouseInputAdapter;

public class testeSLider extends JFrame {
    private JPanel jp;
    private JScrollPane sc;

    public testeSLider() {
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        setSize(new Dimension(820, 130));
        setBackground(Color.BLACK);
        jp = new JPanel();
        sc = new JScrollPane(jp);
        jp.setBackground(Color.GRAY);

        sc.setBounds(0, 0, 100, 400);
        sc.setBackground(Color.DARK_GRAY);
        sc.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 0));
        sc.setBounds(50, 30, 300, 50);

        getContentPane().add(sc);

        int x = 0;
        for (int i = 0; i < 50; i++) {
            JPanel item = new JPanel();
            x = (87 * i) + (i * 10);

            item.setBackground(Color.getHSBColor(new Random().nextInt(255),
                    new Random().nextInt(255), new Random().nextInt(255)));
            item.setBounds(x, 5, 0, 0);
            item.setPreferredSize(new Dimension(90, 90));
            jp.add(item);
            addEfeito(item);
        }

    }

    private void addEfeito(JPanel item) {

        MouseInputAdapter adapter = new MouseInputAdapter() {
            private JPanel panelTmp;
            private int deslocamento = 3;
            private int mouseStartX;
            private int mouseStartY;

            @Override
            public void mouseDragged(MouseEvent e) {

                final JScrollBar bar = sc.getHorizontalScrollBar();
                int currentValue = bar.getValue();
                bar.setValue(currentValue + (mouseStartX - e.getX()));
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                panelTmp = ((JPanel) e.getSource());
                panelTmp.setBounds(panelTmp.getX(), panelTmp.getY(),
                        panelTmp.getWidth() + deslocamento,
                        panelTmp.getHeight() + deslocamento);

            }

            @Override
            public void mouseExited(MouseEvent e) {
                panelTmp = ((JPanel) e.getSource());

                panelTmp.setBounds(panelTmp.getX(), panelTmp.getY(),
                        panelTmp.getWidth() - deslocamento,
                        panelTmp.getHeight() - deslocamento);

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                mouseStartX = e.getX();
                mouseStartY = e.getY();
            }

            @Override
            public void mousePressed(MouseEvent e) {
                mouseStartX = e.getX();
                mouseStartY = e.getY();
            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }
        };
        item.addMouseListener(adapter);
        item.addMouseMotionListener(adapter);

    }

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

}