【发布时间】:2009-11-13 08:15:40
【问题描述】:
我有一个JScrollPane 和FlowLayout,我想要一个固定的宽度。它应该只垂直滚动,当我调整窗口大小时,内容应该自动重新排列。我觉得应该有setEnableHorizontalScroll(false)这样的方法但是找不到。
有什么简单的方法吗?
【问题讨论】:
标签: java swing jscrollpane horizontal-scrolling
我有一个JScrollPane 和FlowLayout,我想要一个固定的宽度。它应该只垂直滚动,当我调整窗口大小时,内容应该自动重新排列。我觉得应该有setEnableHorizontalScroll(false)这样的方法但是找不到。
有什么简单的方法吗?
【问题讨论】:
标签: java swing jscrollpane horizontal-scrolling
你可以使用:
import static javax.swing.ScrollPaneConstants.*;
// ...
JScrollPane.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);
...但这只是阻止了水平滚动条的显示。
要让内容自动重新排列将取决于内容是什么。 JTextPane 或 JEditorPane 会自动为您执行此操作(无需上述代码)。
【讨论】:
JPanels,不会自动重新排列。滚动条消失了 :(
JScrollPane.HOTRIZONTAL_SCROLLBAR_NEVER 是如果您想跳过该导入,您必须传递给它的变量。 Matthew 的解决方案对我有用,谢谢。
最后我知道了,请看这个非常简短的例子,不需要高级技巧:
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);
}
}
【讨论】:
这不是 JDK 中开箱即用的自定义解决方案。
您可以使用WrapLayout。
或者您可以创建一个自定义面板并实现 Scrollable 接口。在这种情况下,关键是重写 getScrollableTracksViewportWidth() 以返回 true,因此视口宽度而不是面板的宽度用于布局目的。这种方法的一个例子可以在ScrollableFlowPanel
中找到【讨论】:
您可以使用 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 添加元素
【讨论】:
试试这个,这对我很好 jScrollPane1.setHorizontalScrollBar(null);
【讨论】:
我也遇到过这个问题...我的解决方案是修改JScrollPane source code 并传递一个附加参数来禁用水平滚动。编辑非常简单:
第 53 行:
$.fn.jScrollPane = function (settings, horizontalScrollingEnabled) {
然后,在第 177 行:
if (horizontalScrollingEnabled) {
isScrollableH = percentInViewH > 1;
} else {
isScrollableH = false;
}
这就是您需要更改的全部内容。缩小修改后的源代码并将其包含在您的页面中。初始化 jScrollPane 时,您现在可以设置是否希望它水平滚动,如下所示:
$('.scroll-pane').jScrollPane("", false);
希望对您有所帮助。
【讨论】:
只需使用水平条的 CSS 类将显示设置为“无”。在你的 jScrollPlane 的底部(在你初始化它之后),添加:
$('.jspHorizontalBar').css({ 'display': 'none' });
如果在页面上使用倍数,并且有些需要水平条,您可以随时编辑定位以包含父元素。
【讨论】:
只需删除 jquery.jscrollpane.js 中的isScrollableH = percentInViewH > 1;
【讨论】: