Как предотвратить прокрутку JScrollPane при нажатии клавиш со стрелками

У меня есть JPanel внутри JScrollPane, и JPanel использует клавиши со стрелками в функции. Раздражает, что JScrollPane прокручивается при нажатии клавиш со стрелками. Как сделать так, чтобы JScrollPane не прокручивался при нажатии клавиш со стрелками?

2 ответа

Решение

Это может быть слишком много, но вы можете попробовать это:

UIManager.getDefaults().put("ScrollPane.ancestorInputMap",  
        new UIDefaults.LazyInputMap(new Object[] {}));

Вы также можете заменить действие глобально:

InputMap  actionMap = (InputMap) UIManager.getDefaults().get("ScrollPane.ancestorInputMap");
actionMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {
    }});

actionMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {
    }});

Следуя предложению @MadProgrammer, вы можете заменить определенные действия для стрелок на клавиатуре. использование unitScrollRight а также unitScrollDown имена действий:

scrollPane.getActionMap().put("unitScrollRight", new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {
    }});
scrollPane.getActionMap().put("unitScrollDown", new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {
    }});

Я думаю, вам придется заменить ссылку на карту ввода / действия

ActionMap am = scrollPane.getActionMap();
am.remove("scrollDown");
am.remove("scrollUp");

Ключи, которые я извлек из BasicScrollPaneUI, чтобы они могли меняться между интерфейсами, но идея должна работать

ОБНОВИТЬ

Хорошо, это отстой. Я надеялся сойти с рук с простым.

    InputMap im = comp.getInputMap();
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "scrollDown");

    ActionMap am = comp.getActionMap();
    am.put("scrollDown", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {

            System.out.println(e.getSource() + " - no go down");

        }
    });

Если результат действия был аннулирован. Я получил его для работы с JList и большой JPanel

Пока я здесь

    private static final String SCROLL_UP = "scrollUp";
    private static final String SCROLL_DOWN = "scrollDown";
    private static final String SCROLL_HOME = "scrollHome";
    private static final String SCROLL_END = "scrollEnd";
    private static final String UNIT_SCROLL_UP = "unitScrollUp";
    private static final String UNIT_SCROLL_DOWN = "unitScrollDown";
    private static final String SCROLL_LEFT = "scrollLeft";
    private static final String SCROLL_RIGHT = "scrollRight";
    private static final String UNIT_SCROLL_LEFT = "unitScrollLeft";
    private static final String UNIT_SCROLL_RIGHT = "unitScrollRight";

Являются ли другие команды ввода / действия карты

Другие вопросы по тегам