我有一个 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);
答案 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);
}