如何将Component包装到多行

时间:2010-08-06 15:37:45

标签: java swing

我有一个大的组件(比如宽度= 4000px,高度= 200px),并且希望能够在小屏幕上完全看到它。 我没有看到任何简单的方法来做一个包装组件,我的想法如下: 给定一个因子(例如4),通过将子包裹到4行,该组件的大小将为1000x800。大小请求将反向翻译以重塑孩子,依此类推。在绘制时,组件将使用正确的Graphics参数调用子项的paint(Graphics)4次,该参数将包装的空间映射到子空间。 但是,我无法看到如何处理所有事件:我应该为每个子生成的事件(PropertyChange)和每个父生成的事件(Mouse,Key,Resize,....)设置eventlistener吗?这似乎有很多映射,我很乐意听到更简单的方法... ... 我没有太多关注JViewport实现,但也许这可以帮助我,你不觉得吗?

感谢您的建议!

弗雷德里克。

编辑回答一些建议重新设计组件的评论:
请允许我在这里不同意:制作一个组件是一个工作,显示它是另一个工作。如果我想用滚动条显示它,我使用滚动窗格,而如果我想显示它分为4行,我想使用类似的解决方案。

我是相关组件的设计者(并且根据建议对我自己有敏锐的话语,但它导致我无处:-))。我实际上在其中添加了“换行代码”,但它出现(真的很快!),添加点空间转换,绘图管理在组件本身的代码中使它真的很混乱,这就是为什么我想象一个专门的组件是一个非常好的解决方案。 此外,制作自定义组件使我可以更轻松地将其重新用作任何其他组件的“包装器”。 想象一下,如果你每次使用JScollPane时都需要重新创建类似JScollPane的功能,处理滚动位置,缓冲绘画以及你自己组件中的所有内容:希望你不必这样做!

2 个答案:

答案 0 :(得分:1)

你接近这个错误的方式。它是组件的内容,而不是您应该考虑的组件本身。如果你想要它是1000x800,那就把它做成那么大。如果组件具有内容 - 例如文本或其他组件 - 适当计算其位置。 (您可能无法使用标准布局,并可能最终编写自己的布局)。如果组件的宽度发生变化,您可能需要重新计算布局。

不要叫油漆4次。如果你已经计算了组件的布局,它是儿童或文本,那么绘画应该正常工作。

回应评论:在插入任意换行符的意义上,包装直方图不太可能有用。使用图形组件时,“断路器”将无法准确知道插入断点的位置;您还将丢失附加到Y轴的任何信息。更好的解决方案是简单地缩小水平方向上的直方图,直到它适合屏幕宽度,或者一个在另一个下面绘制四个直方图,复制每个直方图的Y轴信息。或者允许在整个直方图上水平滚动;或更改轴,以便水平绘制直方图。如果没有上述工作,也许是因为你有数百个直方图条,也许是一种更具交互性的方法,你将一些直方图条合并在一起给出概述,并允许用户“向下钻取”到情节中获取在更详细的信息。

如果问题是您无法修改原始组件,并且它绘制了固定大小的图像,那么您最好的选择是在其上调用“paint(Graphics)”四次,并使用适当的变换和clipRects图形绘制四个部分'堆叠'。但坦率地说,你可能会抛弃原始组件。直方图并不难绘制,并且有很多免费的绘图软件包可以帮助您。如果遇到原始组件的设计者,请对它们非常粗鲁。

答案 1 :(得分:0)

你没有提到滚动。将它放在它自己的窗格上,然后将该窗格放入滚动面板。