8

我需要显示一个几乎无限滚动的交互式小部件列表,并在添加新数据或用户滚动到未缓存区域时根据需要添加/删除它们。

TreeView (如被问及这里)不是选项,因为,我需要完整的小部件作为项目(由具有多个操作等的标准小部件组成,但 CellRenderer 不适合这个)

更糟糕的是,我事先不知道我的小部件的高度(虽然变化不大),所以使用 VBox 可能会导致跳跃。

使用滚动条应该仍然感觉好像列表是有限的(即仅在滚动完成后更新,因此滚动按钮不会跳离鼠标),并且在调整窗口大小和窗口布局更新时,滚动位置不应该改变太多(焦点小部件应该保持在原处,除非当然焦点小部件被滚动了......)。

最好的方法是什么?甚至当需要添加新的小部件时,甚至可能只是向我发送信号的库?

或者可以强制 ListView 以不太讨厌的方式执行此操作?(即在屏幕外缓冲区上绘制,使用 CellRenderer 将其复制到单元格中,将鼠标/键盘事件中继到实际的小部件?)

4

1 回答 1

3

如果它是一个无限列表,那么您不应该尝试使用滚动条来实现任何目标 - 这仅适用于有限列表。

我的建议是使用带有 2 个按钮的叠加层

+------------+
| UP ARROW   |
+------------+
| ITEM  N    |
| ITEM  N+1  |
| ITEM  N+2  |
+------------+
| DOWN ARROW |
+------------+

对于按钮之间的列表,您可能必须自己实现一个自定义容器小部件。我建议提前在每个方向缓冲 n (>=2) 个小部件/项目。

与自定义容器无关,但与自定义小部件相关 - 一个起点

http://zetcode.com/tutorials/cairographicstutorial/customgtkwidget/

http://gnomejournal.org/article/34/writing-a-widget-using-cairo-and-gtk28

http://old.nabble.com/Custom-container-%2B-Child-type-with-interface-td26863728.html

于 2012-09-15T10:01:30.590 回答