如何指定Jlist宽度?

时间:2013-11-06 18:20:49

标签: java swing layout-manager jlist preferredsize

我想指定我的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

6 个答案:

答案 0 :(得分:6)

不,请勿设置已添加到JList的{​​{1}}的尺寸。因为JScrollpane具有已实现的函数JList,它通过计算它包含的单元格宽度和单元格高度来计算优先getPreferredScrollableViewportSize()大小。让viewport来处理。如果需要,请尝试添加JScrollPane尺寸。但是,要控制项目显示编号和方向,您可以使用:

  • JScrollPane's ,可让列表在多列中显示其数据。价值:

    1. setLayoutOrientation :指定列表在换行到新行之前应从左到右显示其项目。
    2. JList.HORIZONTAL_WRAP :指定在换行到新列之前,数据从上到下显示(照例)。
  • JList.VERTICAL_WRAP 使列表显示屏幕上可用空间中可能的最大项目数。 setVisibleRowCount(-1)的另一个常见用途是向列表的滚动窗格指定列表优先显示的行数。

查看: How to Use List了解演示和示例。

答案 1 :(得分: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大小。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

fixed size list in Java

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

答案 4 :(得分:1)

您只需使用JList的setFixedCellWidth

答案 5 :(得分:0)

    // 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。我还能够添加美元符号并格式化小数位。

enter image description here