我想在JTable中创建自定义单元格。我使用自定义渲染器并返回JPanel对象。
它有效,但有一个问题。当程序运行时,JPanel使用paintComponent()方法自行绘制。在每个“tick”(通常每100ms),面板越来越宽(I m drawing kind of graph) and when it becomes too big the rest is just hidden. I
d喜欢它来调整大小并创建滚动条。我尝试了几种放置ScrollPane但没有一种方法可行。基本上,我想要类似的东西Java VisualVM中的线程视图。有什么想法吗?
答案 0 :(得分:1)
将滚动窗格放在普通表格单元格中是很困难的,因为只有一个组件用于渲染表格中的所有单元格。可以删除JTable并将大量组件放在带有网格布局的普通JPanel中吗?
如果您仍想使用JTable:
每个滚动窗格都包含特殊的JViewport控件。这个JViewport控件实际上完成了所有滚动工作,而JSrollPane本身只用滚动条来布局它。由于单个视口用于所有单元格,因此必须存储此视口滚动位置的某个位置,并为每个绘制单元格恢复它(在getCellRenderer方法上)。但是JSrollPane需要大量的布局工作才能解决这个问题。
可能是最优选的解决方案:覆盖JPane单元格渲染器绘制方法,此绘制方法必须使用适当的滚动偏移创建子图形(Graphics.create())。滚动偏移数据必须存储在某处(例如,在表模型中)。当用户单击单元格时,JTable开始单元格编辑,并安装单元格编辑器。这必须是特殊的单元格编辑器,包含滚动窗格本身。用户滚动此控件(无需特殊支持)并完成单元格编辑,您必须将滚动位置保存到模型(在stopCellEditing()函数中)。然后单元格渲染绘制本身,并在绘制方法中获取内容滚动偏移模型。用户看到滚动的单元格。您还可以将JScrollBar放在单元格渲染中,这样用户就可以看到滚动位置(但需要特殊支持)。您也可以使用JViewport本身来完成所有的痛苦工作,但在控制中很难理解。我没有看到任何麻烦机智在单元格编辑器中使用滚动裤,所以它必须工作。无论如何,这是一项巨大的工作。
答案 1 :(得分:0)
所以你已经设置了一个自定义表格单元格渲染器,我假设这个渲染器是JScrollPane
上的JPanel
视图。您可能需要在滚动窗格上调用setPreferredSize()
并调用面板上的setPreferredSize()
和/或setSize()
(或滚动窗格中正在查看的任何内部元素)调用validate()
来触发布局更新。