2010-08-06 40 views
0

我有一个很大的组件(比如width = 4000px,height = 200px),并且希望能够在小屏幕上完全看到它。 我没有看到任何简单的方法来做一个包装组件,我的想法如下: 给定一个因素(例如4),组件的大小为1000x800,通过包装孩子到4行。尺寸要求将被翻转以重塑儿童,等等。在绘画上,组件会用一个正确的Graphics参数调用孩子的paint(Graphics)4次,该参数会将包装后的空间映射到孩子的空间。
但是,我看不到如何处理所有事件:我应该为每个儿童生成的事件(PropertyChange)和每个父生成事件(Mouse,Key,Resize,....)设置eventlisteners?这似乎相当多的映射,我很乐意听到一个更简单的方法做到这一点...
我没有看太多在JViewport的实施,但也许这可以帮助我不要你认为?如何将组件包装到多行

感谢您的建议!

Frederic。

编辑回答了一些建议重新设计组件的意见:
请允许我在此不同意:使组件成为一项工作,表明它是另一项工作。如果我想用滚动条来显示它,我使用滚动窗格,而如果我想要将它分成4行,我想使用类似的解决方案。

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

回答

1

你正在接近这个错误的方式。这是组件的内容,而不是你应该考虑的组件本身。如果您希望它是1000x800,请将其设置为这个尺寸。如果组件具有内容 - 例如文本或其他组件 - 适当地计算它们的位置。 (您可能无法使用标准布局,并可能最终编写自己的布局)。如果组件的宽度发生变化,您可能会需要重新计算布局。

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

作为对该评论的回应:在插入任意换行符的意义上,打包直方图不太可能有用。对于图形组件,“断路器”不会准确知道在哪里插入断点;您也将失去附加到Y轴的任何信息。更好的解决方案是简单地将水平方向上的直方图缩小到适合屏幕宽度,或者将四个直方图一个放在另一个下方,复制每个的Y轴信息。或者允许水平滚动整个直方图;或更改坐标轴,使直方图水平绘制。如果以上任何一项工作都不奏效(可能因为您有数百个直方图条),也许是一种更具交互性的方法,您可以将一些直方图条融合在一起以提供概述,并允许用户“深入”到图中以获得在更详细的信息。

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

+0

你似乎建议重新设计子组件,但问题是这个组件是一些活动的直方图,并且它的paintcomponent()中有一个4000x200px的图像。这就是为什么我正在寻找一种更通用的方式将其放在4行中而不用触摸它... – Goulou 2010-08-08 07:48:45

+0

在我回答此评论之前,通常最好通过编辑原始问题而不是添加解释性评论来完成此操作。 – DJClayworth 2010-08-09 13:33:51

+0

如果你说你有一个组件,你不能修改它绘制一个4000x200的图像,并且不允许大小改变,那么找出谁设计了这个组件,并且与他们有非常尖锐的词汇。 – DJClayworth 2010-08-09 17:52:53

0

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

相关问题