JScrollPane使我的JList单元格的width属性无效

时间:2012-03-30 00:23:45

标签: java swing

我有一个 JFrame ,它只包含 JList JList 有自己的单元格渲染器,在单元格渲染器中有一个 JTextPane 以自定义大小返回。自定义大小的结果是此文本窗格的行被包装。

textPane.setSize(WIDTH, HEIGHT);

现在我想让这个JList可滚动,所以我将它包装到JScrollPane组件中,然而,这会使我在单元格渲染器中定义的宽度约束无效。在JScrollPane中强制执行宽度约束的最佳方法是什么?

setSize(FRAME_WIDTH, FRAME_HEIGHT);
setLayout(new BorderLayout());

DefaultListModel<Status> listModel = new DefaultListModel<Status>();
JList<Status> list = new JList<>(listModel);
list.setLayout(new BorderLayout());
list.setSize(FRAME_WIDTH, FRAME_HEIGHT);
list.setCellRenderer(new MyCellRenderer());
// wrap the list with a JScrollPane
add(new JScrollPane(list), BorderLayout.CENTER);

1 个答案:

答案 0 :(得分:0)

Cell的渲染操作由javax.swing.plaf.basic.BasicListUI类完成,无论您为单元格渲染器设置的大小,它都会绘制整个大小写。您可以深入了解BasicListUI类的源代码,以了解它的工作原理。

我猜您只是为了确保可以全部显示单元格的内容。在这种情况下,您可以为列表添加水平滚动条。为此,请获取列表的首选宽度。

如下所示:

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(800, 600);

    JList list = new JList(new Object[]{ "11", "22" })
    {
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(1000, 800);
        }
    };
    frame.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);

    frame.setVisible(true);
}