【发布时间】:2012-02-25 11:38:36
【问题描述】:
我正在尝试将 JList 放在 JScrollPane 内,并让它按字母顺序列出垂直列中的条目,如下所示:
A D G
B E H
C F
但是,当JList 用完空间来显示更多条目时,我希望JScrollPane仅在垂直方向滚动。 p>
这在我使用VERTICAL_WRAP 时有效。但是,似乎当我使用垂直换行时,我得到了一个水平滚动条,而当我使用 HORIZONTAL_WRAP 时,我得到了我想要的滚动条,但是这些项目以我不喜欢的顺序放置。我可以把我的蛋糕也吃掉吗?这是我正在尝试做的一个简单示例。
这是我能得到的最接近的,但我希望能够在保持垂直字母顺序的同时垂直滚动。
public class ScrollListExample {
static List<String> stringList = new ArrayList<String>();
static {
for (int i = 0; i < 500; i++) {
stringList.add("test" + i);
}
}
public static void main(final String[] args) {
final JFrame frame = new JFrame();
final Container contentPane = frame.getContentPane();
final JList list = new JList(stringList.toArray());
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(0);
final JScrollPane scrollPane = new JScrollPane(list);
contentPane.add(scrollPane);
frame.setPreferredSize(new Dimension(800, 400));
frame.pack();
frame.setVisible(true);
}
}
我想到的一个解决方案是: 如果单元格大小已知,我可以创建一个组件侦听器,并侦听调整大小事件。当该事件被触发时,我可以计算所需的行数以防止水平滚动。这看起来像是一个 hack,我不确定它如何处理可变大小的文本组件。
【问题讨论】:
-
使用
VERTICAL_WRAP时获得水平滚动条的原因是`VERICAL_WRAP => 表示单元格垂直流动然后水平流动的“报纸风格”布局。所以,如果单元格将垂直流动并到期到您的尺寸,输出将从底部包裹,因此它将开始水平填充。因此有一个水平滚动条。 -
这是有道理的,但我调整内部组件大小的大部分尝试都没有达到我的预期。我将如何强制它显示垂直滚动条,而不是水平滚动条?我需要调整特定组件的大小吗?
-
@Lockyer:您需要的确切输出是什么,因为您可以使用
HORIZONTAL_WRAP获得vertical scrollbar,正如您所提到的。您需要的顺序是什么。 -
我希望列表中的元素按字母顺序在窗口中垂直向下移动,以便更容易在视觉上扫描。就像您在 Windows 中选择“列表”视图时资源管理器所做的那样。
-
我要指出,资源管理器的列表视图使用水平滚动条,至少在 Windows XP 上是这样。
标签: java swing user-interface jscrollpane jlist