当前位置: 首页 > 面试题库 >

JTextPane防止在父JScrollPane中滚动

郭知
2023-03-14
问题内容

我有以下对象的“树”:

JPanel
    JScrollPane
        JPanel
            JPanel
                JScrollPane
                    JTextPane

当使用鼠标滚轮在外部JScrollPane上滚动时,遇到一个令人讨厌的问题。一旦鼠标光标触摸到内部JScrollPane,滚动事件似乎就会传递到该JScrollPane中,并且第一个事件不再对其进行处理。这意味着停止滚动“父”
JScrollPane。

是否可以
禁用内部JScrollPane上的鼠标滚轮?甚至更好的是,如果没有要滚动的内容(大多数情况下,文本窗格仅包含1-3行文本),请禁用滚动功能,但是 如果
有更多内容, 启用滚动功能?


问题答案:

我也遇到了这个烦人的问题,Sbodd的解决方案对我来说是不可接受的,因为我需要能够在表和JTextAreas中滚动。我希望其行为与浏览器相同,在可滚动控件上的鼠标将滚动该控件,直到控件触底,然后继续滚动父滚动窗格,通常是整个页面的滚动窗格。

本课程将做到这一点。只需使用它代替常规的JScrollPane。希望对您有帮助。

/**
 * A JScrollPane that will bubble a mouse wheel scroll event to the parent 
 * JScrollPane if one exists when this scrollpane either tops out or bottoms out.
 */
public class PDControlScrollPane extends JScrollPane {

public PDControlScrollPane() {
    super();

    addMouseWheelListener(new PDMouseWheelListener());
}

class PDMouseWheelListener implements MouseWheelListener {

    private JScrollBar bar;
    private int previousValue = 0;
    private JScrollPane parentScrollPane;

    private JScrollPane getParentScrollPane() {
        if (parentScrollPane == null) {
            Component parent = getParent();
            while (!(parent instanceof JScrollPane) && parent != null) {
                parent = parent.getParent();
            }
            parentScrollPane = (JScrollPane)parent;
        }
        return parentScrollPane;
    }

    public PDMouseWheelListener() {
        bar = PDControlScrollPane.this.getVerticalScrollBar();
    }
    public void mouseWheelMoved(MouseWheelEvent e) {
        JScrollPane parent = getParentScrollPane();
        if (parent != null) {
            /*
             * Only dispatch if we have reached top/bottom on previous scroll
             */
            if (e.getWheelRotation() < 0) {
                if (bar.getValue() == 0 && previousValue == 0) {
                    parent.dispatchEvent(cloneEvent(e));
                }
            } else {
                if (bar.getValue() == getMax() && previousValue == getMax()) {
                    parent.dispatchEvent(cloneEvent(e));
                }
            }
            previousValue = bar.getValue();
        }
        /* 
         * If parent scrollpane doesn't exist, remove this as a listener.
         * We have to defer this till now (vs doing it in constructor) 
         * because in the constructor this item has no parent yet.
         */
        else {
            PDControlScrollPane.this.removeMouseWheelListener(this);
        }
    }
    private int getMax() {
        return bar.getMaximum() - bar.getVisibleAmount();
    }
    private MouseWheelEvent cloneEvent(MouseWheelEvent e) {
        return new MouseWheelEvent(getParentScrollPane(), e.getID(), e
                .getWhen(), e.getModifiers(), 1, 1, e
                .getClickCount(), false, e.getScrollType(), e
                .getScrollAmount(), e.getWheelRotation());
    }
}
}


 类似资料:
  • 当我将JTextPane添加到SOUTH位置时,滚动窗格会滚动以显示文本。我不希望滚动窗格从其最上面的位置移动。我怎样才能防止这种情况?

  • 我有一个垂直滚动的JPanel,在该JPanel上有几个JScrollPane,当用户向下滚动面板时,如果用户的鼠标越过JScrollPane,他们就不能再滚动JPanel,他们必须将鼠标从JScrollPane移回面板上。过一段时间就会变得很烦人。

  • 问题内容: 以下类实现了chatGUI。正常运行时,屏幕如下所示: 精美的ChatGUI http://img21.imageshack.us/img21/7177/rightchat.jpg 当我输入较大长度的文本时,问题经常出现。50到100个字符的gui变得疯狂。聊天记录框如下所示缩小 图片http://img99.imageshack.us/img99/6962/errorgui.jpg。

  • 问题内容: 我有这个(包裹在)中,并有个。的内容是简单的HTML,其中包含使用img标签嵌入的某些图片(本地文件)。问题是,当您加载时,需要花一秒钟的时间来加载,然后在页面底部显示滚动条。如果我做: 它会暂时设置滚动条,然后出现另一个主题(大概负责加载图像)并将滚动条打回到底部。我尝试添加: 但这并没有解决。有没有办法从任一得到一个事件或当窗格完成加载,这样我可以设置滚动条,然后会通知我吗?另一种

  • 如何防止带有滚动条和的子div在Firefox中超过其父flexbox的高度?它在Chrome中正常工作。 CodePen链接(如果您喜欢它来堆叠溢出代码段):https://codepen.io/garyapps/pen/ZMNVJg 细节: 我有一个固定高度的柔性容器。它有一个设置,它包含多个垂直堆叠的Childen div。其中一个子div被赋予一个属性,而其他div被赋予固定的高度。 我期