带有JScrollPane和原型单元格值的JList包装元素名称(用点替换而不是显示水平滚动条),为什么?

时间:2010-04-27 19:56:23

标签: java scroll wrapping jlist jscrollpane

我在JScrollPane中有一个Jlist,我设置了一个原型值,这样它就不必计算大列表的宽度,而只是使用这个默认宽度。

现在,问题是Jlist由于某种原因用点(...)替换元素的末尾,因此永远不会显示水平滚动条。

如何使用“换行”禁用?如果它们比Jlist的宽度宽,那么长元素不会被点替换?

我在一个小例子应用程序中重现了这个问题。如果你不明白我的意思,请运行它:

import javax.swing.*;
import java.awt.*;

public class Test
{
    //window
    private static final int windowWidth = 450;
    private static final int windowHeight = 500;

    //components
    private JFrame frame;
    private JList classesList;
    private DefaultListModel classesListModel;

    public Test()
    {
        load();
    }

    private void load()
    {   
        //create window
        frame = new JFrame("Test");
        frame.setSize(windowWidth, windowHeight);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);

        //classes list
        classesListModel = new DefaultListModel();
        classesList = new JList(classesListModel);
        classesList.setPrototypeCellValue("prototype value");
        classesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        classesList.setVisibleRowCount(20);
        JScrollPane scrollClasses = new JScrollPane(classesList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);     

        for (int i = 0; i < 200; i++)
        {
            classesListModel.addElement("this is a long string, does not fit in width");
        }

        //panel
        JPanel drawingArea = new JPanel();
        drawingArea.setBackground(Color.white);

        drawingArea.add(scrollClasses);
        frame.add(drawingArea);

        //set visible
        frame.setVisible(true);
    }
}

即使你强制使用水平滚动条,你仍然无法滚动,因为由于点(...)包裹,元素实际上并不宽于宽度。

提前致谢。

3 个答案:

答案 0 :(得分:3)

当添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,会自动显示滚动条。

通过使用setPrototypeCellValue(...)方法,您正在影响列表计算其首选大小的方式,这意味着您有责任提供确保字符串不会被截断的正确值。

所以简单的解决方案不是不使用该方法,而是需要将滚动窗格的首选大小设置为您想要的任何内容。然后,如果需要,将出现水平滚动条。

答案 1 :(得分:2)

我对这个问题的回答是首先找到列表中最长的元素然后使用 关于那个元素的setPrototype方法

答案 2 :(得分:1)

当您致电classesList.setPrototypeCellValue("prototype value")时,您告诉JList classesList将其最大宽度限制为字符串“原型值”的长度。 (See javadocs

然后,当您使用字符串填充列表时“这是一个长字符串,不适合宽度”,难怪它不适合宽度!因为你给它的原型的宽度小于你填充列表的字符串的宽度。

JScrollPane将自动显示滚动条,您通常无需调整其行为。 JList还将自动调整其宽度,以尝试显示列表中的最大宽度项。当您通过调用setPrototypeCellValue()告诉JList修复其宽度时会发生此问题。

如果你发表评论

classesList.setPrototypeCellValue("prototype value");

或用

替换它

classesList.setPrototypeCellValue("this is a long string, does not fit in width");

然后它将按照你的预期运作。