【问题标题】:How to specify Jlist width?如何指定 Jlist 宽度?
【发布时间】:2013-11-06 18:20:48
【问题描述】:

我想指定我的 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。我需要JScrollPane 的宽度为 200

【问题讨论】:

  • 请问我想指定 JList 的大小、JList 的大小或可见项的数量或 ??? .....
  • 大约是 JScrollPane 的宽度
  • 我需要 JScrollPane 的宽度为 200 - 为什么?固定像素大小总是(最多为第三个近似值左右;-) 表明您的方法/要求有问题。无论如何,don't use setXXSize, everstackoverflow.com/a/7229519/203657
  • 您可以提供一个原型值,JList 将使用它来确定它的首选宽度和行高,而无需处理整个列表模型

标签: java swing layout-manager jlist preferredsize


【解决方案1】:

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

  • setLayoutOrientation 让列表在多列中显示其数据。价值:

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

查看:How to Use List 获取演示和示例。

【讨论】:

  • setVisibleRowCount(-1) 使我的 JScrollpane 和 JList 消失,因为布局管理器不知道它喜欢或至少需要多少空间,解决方法是将 setVisibleRowCount(size) 设置为更大的大小不适合屏幕,这样您的布局将分配尽可能多的空间/可用到 Scrollpane 和 JList。
【解决方案2】:

大约是 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 的大小。

【讨论】:

  • 即使有一点的理解,即使设置宽度:硬编码 xxSizes 会在最轻微的变化和中途稳定的应用程序中破坏视觉效果代码需要在可能影响该值的任何属性(在编码时无法知道)上动态重新设置。唯一的出路是根本不使用这些方法。
【解决方案3】:

解决方案是调整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);

【讨论】:

  • 是的,方法是yourScrollPane.getViewport().setViewSize(yourDimension);
  • 不,您是在鼓励 OP 走向错误的方向。永远不要使用 NullLayout ,永远不要使用 setLocationbounds
【解决方案4】:

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

fixed size list in Java

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

【讨论】:

  • 我相信他是根据他设置的 Dimension 来询问它的 GUI 大小。
  • 这是正确的。我很抱歉混淆了。我想要一个固定的宽度
【解决方案5】:

您可以简单地使用 JList 的setFixedCellWidth

【讨论】:

  • 正是我所需要的——胜过我发现的许多其他深入解释
【解决方案6】:
    // 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。我还能够添加美元符号并格式化小数位。

【讨论】:

  • 我喜欢这个答案,你能显示代码,并且可能的中心显示数量在右侧吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多