在jScrollPane中禁用水平滚动

18

我有一个带有FlowLayoutJScrollPane,我想要它具有固定的宽度。它应该只能垂直滚动,在我重新调整窗口大小时自动重新排列内容。我认为应该有一个像setEnableHorizontalScroll(false)这样的方法,但我找不到。

有什么简单的方法可以做到这一点吗?

8个回答

26
你可以使用:

你可以使用:

import static javax.swing.ScrollPaneConstants.*;
// ...
JScrollPane.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);

...但这只是防止水平滚动条被显示出来。

要使内容自动重新排列取决于内容的类型。 JTextPaneJEditorPane将自动为您完成此操作(无需使用上述代码)。


1
内容是固定大小的 JPanel,它们不会自动重新排列。 滚动条只是消失了 :( - phunehehe
如果您想跳过导入,JScrollPane.HOTRIZONTAL_SCROLLBAR_NEVER 是您需要传递给它的变量。Matthew的解决方案对我有用,谢谢。 - Pangolin
1
其他组件应该实现Scrollable接口,并让getScrollableTracksViewportWidth()方法返回false,如下所述。 - Erik Martino

10

最后我找到了方法,请看这个非常简短的例子,不需要高级技巧:

public class MyTest extends JFrame {

    public static void main(String[] args) {
        MyTest test = new MyTest();
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(300, 200);
        test.setVisible(true);
    }

    public MyTest() {
        String[] data = {
            "Arlo", "Cosmo", "Elmo", "Hugo",
            "Jethro", "Laszlo", "Milo", "Nemo",
            "Otto", "Ringo", "Rocco", "Rollo"
        };
        JList list = new JList(data);
        list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        list.setVisibleRowCount(0);
        JScrollPane scroll = new JScrollPane(list);
        this.add(scroll);
    }
}

Adapted from Sun's tutorial


7

在JDK中没有现成的自定义解决方案。

您可以使用WrapLayout

或者您可以创建一个自定义面板并实现Scrollable接口。在这种情况下,关键是重写getScrollableTracksViewportWidth()方法以返回true,这样视口的宽度而不是面板的宽度用于布局目的。此方法的示例可以在ScrollableFlowPanel中找到。


2
我不喜欢使用第三方库的想法。我认为Java应该默认具备这个功能。 但是感谢分享,它已经满足了我的需求 :) - phunehehe

1
您可以使用org.jdesktop.swingx.JXPanel代替javax.swing.JPanel作为JScrollPane的ViewportView:
1. 下载“SwingX 1.6.4 All - Binary”,并将jar文件添加到您的项目库这里。 2. 将JXPanel设置为您的JScrollPane的ViewportView,而不是JPanel:
JScrollPane scrollPane = new JScrollPane();  
JXPanel panel = new JXPanel();  
scrollPane.setViewportView(panel);

3. 添加以下两条语句:

panel.setScrollableTracksViewportHeight(false);  
panel.setScrollableTracksViewportWidth(true);

4. 然后您可以像添加到JPanel一样向JXPanel添加元素


0

试试这个,我用这个很好用 jScrollPane1.setHorizontalScrollBar(null);


-2
我也遇到了这个问题...我的解决方案是修改JScrollPane源代码并传递一个额外的参数来禁用水平滚动。编辑非常简单:
第53行:
$.fn.jScrollPane = function (settings, horizontalScrollingEnabled) {

然后,在第177行:

if (horizontalScrollingEnabled) {
isScrollableH = percentInViewH > 1;
} else {
isScrollableH = false;
}

这就是你需要改变的全部内容。将修改后的源代码进行压缩,并包含在您的页面中。当初始化jScrollPane时,您现在可以设置是否要横向滚动,如下:

$('.scroll-pane').jScrollPane("", false);

希望这有所帮助。

4
对方询问的是 Java 中的 Swing JScrollPane 组件,而不是 jQuery 的 jScrollPane 插件。 - Dathan
@Dathan 哈哈 :D :D 这个用户喝醉了。 - Deval Khandelwal

-2

只需使用水平栏的CSS类将显示设置为“none”。在初始化jScrollPlane后,在其底部添加以下内容:

$('.jspHorizontalBar').css({ 'display': 'none' });

如果在页面上使用多个元素,并且其中一些需要水平滚动条,您可以随时编辑您的目标以包括父元素。

3
这个问题涉及到 Java Swing 组件。 - xmedeko

-2

只需要在 jquery.jscrollpane.js 文件中删除 isScrollableH = percentInViewH > 1; 这一行代码。


2
问题涉及Java Swing组件。 - P Marecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接