0

我在 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);
    }
}

即使您强制水平滚动条,您仍然无法滚动,因为元素实际上并不比宽度更宽,因为点 (...) 环绕。

提前致谢。

4

3 回答 3

3

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

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

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

于 2010-04-27T20:24:58.980 回答
2

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

于 2010-10-21T10:26:50.263 回答
1

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

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

JScrollPane 将自动显示滚动条,您通常不需要调整它们的行为。JList 还将自动调整其宽度以尝试显示列表中的最大宽度项。当您告诉 JList 通过调用setPrototypeCellValue().

如果你注释掉

classesList.setPrototypeCellValue("prototype value");

或将其替换为

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

然后它将按您的预期运行。

于 2010-04-27T20:36:22.483 回答