【问题标题】:How to prevent JScrollPane from scrolling when arrow keys are pressed按下箭头键时如何防止 JScrollPane 滚动
【发布时间】:2012-07-17 00:05:34
【问题描述】:

我在 JScrollPane 中有一个 JPanel,并且 JPanel 在函数中使用箭头键。按下箭头键时 JScrollPane 滚动,这很烦人。如何使 JScrollPane 在按下箭头键时不滚动?

【问题讨论】:

    标签: java swing jscrollpane


    【解决方案1】:

    我认为您将不得不替换输入/操作映射参考

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

    我从 BasicScrollPaneUI 中提取的键,因此它们可能会在 UI 之间发生变化,但这个想法应该可行

    更新

    好吧,那太糟糕了。我希望能够摆脱简单。

        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";
    

    是其他输入/动作映射命令

    【讨论】:

    • @John:这很奇怪;这是一个example,可以用来做实验。
    • 滚动窗格中有什么??
    • 其他人可以自己运行它,但它对我不起作用,我在 JScrollPane 中有一个 JPanel
    • @trashgod 这是个好主意 :)
    【解决方案2】:

    可能太多了,但是你可以试试这个:

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

    你也可以全局替换 action:

    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 的建议,您可以替换键盘箭头的特定操作。使用 unitScrollRightunitScrollDown 操作名称:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 2011-03-13
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多