gpt4 book ai didi

java - JList - 使用垂直滚动条而不是垂直环绕方向的水平滚动条?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:14 25 4
gpt4 key购买 nike

我试图在 JScrollPane 中放置一个 JList 并让它按字母顺序列出垂直列中的条目,如下所示:

A D G
B E H
C F

但是,当 JList 用完空间无法显示更多条目时,我希望 JScrollPane 滚动/strong> 在垂直方向。

这在我使用 VERTICAL_WRAP 时有效。但是,似乎当我使用垂直换行时,我得到了一个水平滚动条,而当我使用 HORIZONTAL_WRAP 时,我得到了我想要的滚动条,但是这些项目的放置顺序我不喜欢。我可以吃我的蛋糕吗?这是我正在尝试做的一个简单示例。

enter image description here

这是我能得到的最接近的结果,但我希望能够在保持垂直字母顺序的同时垂直滚动。

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,我不确定它如何处理可变大小的文本组件。

最佳答案

我认为您的解决方案很好,根本不是 hack。无论如何,任何内置功能都必须做基本相同的事情。

这是对您的示例的修改,它可以满足您的要求。

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);
final JScrollPane scrollPane = new JScrollPane(list);
contentPane.add(scrollPane);
frame.setPreferredSize(new Dimension(800, 400));
frame.pack();

list.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
fixRowCountForVisibleColumns(list);
}
});

fixRowCountForVisibleColumns(list);
frame.setVisible(true);
}

private static void fixRowCountForVisibleColumns(JList list) {
int nCols = computeVisibleColumnCount(list);
int nItems = list.getModel().getSize();

// Compute the number of rows that will result in the desired number of
// columns
int nRows = nItems / nCols;
if (nItems % nCols > 0) nRows++;
list.setVisibleRowCount(nRows);
}

private static int computeVisibleColumnCount(JList list) {
// It's assumed here that all cells have the same width. This method
// could be modified if this assumption is false. If there was cell
// padding, it would have to be accounted for here as well.
int cellWidth = list.getCellBounds(0, 0).width;
int width = list.getVisibleRect().width;
return width / cellWidth;
}
}

关于java - JList - 使用垂直滚动条而不是垂直环绕方向的水平滚动条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9118727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com