Java - Как установить скорость прокрутки клавиатуры для JScrollPane - PullRequest
2 голосов
/ 07 июля 2011

A JPanel имеет JScrollPane, который содержит еще один JPanel или два.Моя жизнь зависит от увеличения скорости прокрутки с помощью стрелок на клавиатуре.После тщательного обсуждения, полномочия, которые должны быть решены, что: sc.getVerticalScrollBar().setUnitIncrement(240); должны быть применимы только к мышке, в умном уловке, чтобы вызвать незначительные раздражения среди разработчиков Java.Что-нибудь можно сделать, чтобы увеличить скорость прокрутки?Моя жизнь висит на волоске.

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Вы должны использовать комбинацию InputMap.put и ActionMap.put , чтобы захватывать события клавиатуры для компонентов, содержащихся в JScrollPane, и обрабатывать события клавиатуры, когдаJScrollPane имеет фокус.Так как значение приращения по умолчанию для прокрутки равно 1, вы должны добавить или вычесть желаемое значение приращения к текущему значению полосы прокрутки для JScrollPane, которое вы можете получить с помощью JScrollPane.getVerticalScrollBar().getValue() и установить с помощью JScrollPane.getVerticalScrollBar().setValue(int).

AnПример захвата событий для содержащихся элементов с помощью 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, относится к абстрактному действию (в этом случае, когда пользователь нажимает клавишу вверх).

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

Что вы должны сделать, это завершить события, когда у вашего JScrollPane есть фокус, но это должно быть тривиально.

Надеюсь, это поможет спасти вашу жизнь: P или, по крайней мере, служить вамотправная точка.

2 голосов
/ 07 июля 2011

Возможно, это не то, что вы ищете, но вы можете использовать Контроллер колесика мыши для ускорения прокрутки при использовании мыши.

Моя жизнь зависит от увеличения скорости прокрутки с помощью стрелок на клавиатуре.

Не уверен, что как вы заставляете прокручивать панель, когда используете клавиатуру. Я не могу заставить прокручивать панель, когда использую стрелки клавиатуры. Опубликуйте SSCCE , который демонстрирует проблему.

Edit:

Для моего простого теста я просто добавил JLabel в область прокрутки. Поскольку JLabel по умолчанию не фокусируется, ни один компонент в области прокрутки не имеет фокуса, поэтому Действия по умолчанию для полос прокрутки там, где они не вызываются. Делая метку фокусируемой, прокрутка клавиатуры работает.

0 голосов
/ 01 апреля 2016
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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...