【问题标题】:disable horizontal scroll in jscrollpane在 jscrollpane 中禁用水平滚动
【发布时间】:2009-11-13 08:15:40
【问题描述】:

我有一个JScrollPaneFlowLayout,我想要一个固定的宽度。它应该只垂直滚动,当我调整窗口大小时,内容应该自动重新排列。我觉得应该有setEnableHorizontalScroll(false)这样的方法但是找不到。

有什么简单的方法吗?

【问题讨论】:

    标签: java swing jscrollpane horizontal-scrolling


    【解决方案1】:

    你可以使用:

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

    ...但这只是阻止了水平滚动条的显示。

    要让内容自动重新排列将取决于内容是什么。 JTextPaneJEditorPane 会自动为您执行此操作(无需上述代码)。

    【讨论】:

    • 内容为固定大小的JPanels,不会自动重新排列。滚动条消失了 :(
    • JScrollPane.HOTRIZONTAL_SCROLLBAR_NEVER 是如果您想跳过该导入,您必须传递给它的变量。 Matthew 的解决方案对我有用,谢谢。
    • 其他组件应该实现 Scrollable 并让 getScrollableTracksViewportWidth() 返回 false,如下所述。
    【解决方案2】:

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

    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);
        }
    }
    

    改编自Sun's tutorial

    【讨论】:

      【解决方案3】:

      这不是 JDK 中开箱即用的自定义解决方案。

      您可以使用WrapLayout

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

      中找到

      【讨论】:

      • 我不喜欢使用第三方库的想法。我认为Java默认应该有这个。但是感谢分享,它已经满足了我的需求:)
      【解决方案4】:

      您可以使用 org.jdesktop.swingx.JXPanel 而不是 javax.swing.JPanel 作为 JScrollPane 的 ViewportView:

      1.下载“SwingX 1.6.4 All - Binary”,并将jar添加到您项目的库here.

      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 添加元素

      【讨论】:

        【解决方案5】:

        试试这个,这对我很好 jScrollPane1.setHorizo​​ntalScrollBar(null);

        【讨论】:

          【解决方案6】:

          我也遇到过这个问题...我的解决方案是修改JScrollPane source code 并传递一个附加参数来禁用水平滚动。编辑非常简单:

          第 53 行:

          $.fn.jScrollPane = function (settings, horizontalScrollingEnabled) {
          

          然后,在第 177 行:

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

          这就是您需要更改的全部内容。缩小修改后的源代码并将其包含在您的页面中。初始化 jScrollPane 时,您现在可以设置是否希望它水平滚动,如下所示:

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

          希望对您有所帮助。

          【讨论】:

          • OP 询问的是 Java 中的 Swing JScrollPane 组件,而不是 jquery 的 jScrollPane 插件。
          • @Dathan LOL :D :D 这个用户喝醉了
          【解决方案7】:

          只需使用水平条的 CSS 类将显示设置为“无”。在你的 jScrollPlane 的底部(在你初始化它之后),添加:

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

          如果在页面上使用倍数,并且有些需要水平条,您可以随时编辑定位以包含父元素。

          【讨论】:

          • 问题是关于 Java Swing 组件的。
          【解决方案8】:

          只需删除 jquery.jscrollpane.js 中的isScrollableH = percentInViewH > 1;

          【讨论】:

          • 问题是关于 Java Swing 组件的。
          猜你喜欢
          • 2015-06-19
          • 1970-01-01
          • 2012-08-14
          • 2018-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多