3

我想指定我的 JList 的固定宽度

我遵循Gilbert Le Blanc 22k提供的示例

        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
        Panel panel = new JPanel();
        panel.setBackground(Color.WHITE);
        getContentPane().add(panel);

        String [] queries = {"a", "b", "a", "b" , "a", "b", "a", "b"};
        panel.setLayout(new BorderLayout());
        JList list = new JList(queries);
        list.setMaximumSize(new Dimension(200, 200));  // this line does not do the job
        list.setMinimumSize (new Dimension (200,200));
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setVisibleRowCount(5);
        JScrollPane scrollPane_1 = new JScrollPane(list);
        panel.add(scrollPane_1 , BorderLayout.CENTER);

但这并不强制大小为200 200. 我需要宽度为JScrollPane200

4

6 回答 6

7

不,不要设置JList已添加到JScrollpane. 因为JList有一个实现的函数,它通过计算它包含的单元格宽度和单元格高度来getPreferredScrollableViewportSize()计算优选的大小。viewportJScrollPane来处理。如果需要,您可以尝试添加JScrollPane's维度。但是,要控制项目显示数量和方向,您可以使用:

  • setLayoutOrientation这使列表可以在多列中显示其数据。价值:

    1. JList.HORIZONTAL_WRAP:指定列表在换行到新行之前应该从左到右显示其项目。
    2. JList.VERTICAL_WRAP:它指定数据在换行到新列之前从上到下(像往常一样)显示。
  • setVisibleRowCount(-1)使列表在屏幕上的可用空间中显示尽可能多的项目。另一个常见用途setVisibleRowCount是向列表的滚动窗格指定列表希望显示的行数。

查看:如何使用列表进行演示和示例。

于 2013-11-06T19:01:36.643 回答
5

它大约是 JScrollPane 的宽度

大多数布局管理器使用首选大小来确定最佳大小,然后在调整框架大小时使用最小/最大来处理大小调整。

我会尝试类似的东西:

JList list = new JList(queries);
list.setVisibleRowCount(5);
JScrollPane scrollPane_1 = new JScrollPane(list);
Dimension d = list.getPreferredSize();
d.width = 200;
scrollPane_1.setPreferredSize(d);

尽管手动设置组件的首选大小很少是一个好主意。让 LAF 确定合适的首选尺寸。例如,我永远不会硬编码高度,因为那样你的列表可能会显示 4 1/2 行,这看起来很不专业。

如果您只有一个字符串,我可以理解的宽度可能看起来太窄了。但在这种情况下,更好的解决方案是创建自定义渲染器并使用 EmptyBorder 在左/右分配额外空间,然后让 LAF 调整 JList 的大小。

于 2013-11-06T19:05:00.410 回答
5

解决方案是调整JScrollPane. 如果我没记错,请JList填写JScrollPane.

JScrollPane scrollPane_1 = new JScrollPane(list);
scrollPane_1.setMaximumSize(new Dimension(200, 200));
scrollPane_1.setMinimumSize (new Dimension (200,200));
panel.add(scrollPane_1 , BorderLayout.CENTER);
于 2013-11-06T18:27:07.570 回答
3

您可以简单地使用setFixedCellWidth您的 JList。

于 2015-02-01T18:39:57.270 回答
3

通常您的列表的大小是您放入其中的元素的数量,因此不会以这种方式修复。你不能创建一个包含 N 个空格的列表,因为它不会是一个列表(它的长度是多少?) - 一个数组更适合这里。如果要创建固定大小的列表,请参阅:

Java中的固定大小列表

您还可以创建一个类,允许您将指定数量的元素添加到列表中,然后禁止进一步添加(当列表的大小达到所需的 N 时)。

于 2013-11-06T18:25:51.473 回答
1
    // Loop through the arrayList of doubles and convert to String
    // with dollar signs, 2 decimal places, and extra spacing.
    for(int i = 0; i < bookPrices.size(); i++)
    {
        bookPricesOnlyStrings.add(String.format("$%,.2f%-35s", bookPrices.get(i), ""));
        System.out.println(bookPricesOnlyStrings.get(i));
    }

我有同样的问题。我的数据只有 5 个字符,与我的其他窗口相比看起来不太好。所以我使用 String.format 在它的末尾添加空格。这扩大了我的 JList。我还能够添加美元符号并格式化小数位。

在此处输入图像描述

于 2016-08-10T17:56:05.027 回答