Java 如何将组件包装为多行

Java 如何将组件包装为多行,java,swing,Java,Swing,我有一个很大的组件(比如宽度=4000px,高度=200px),我希望能够在小屏幕上看到它。 我看不到任何简单的包装组件的方法,我的想法如下: 给定一个因子(例如4),通过将子元素包装为4行,该组件的大小将为1000x800。大小请求将被反向转换以重塑子对象,以此类推。在绘制时,组件将使用正确的图形参数调用子对象的绘制(图形)4次,该参数将包装的空间映射到子对象的空间。 但是,我看不出如何处理所有事件:我应该为每个子级生成的事件(PropertyChange)和每个父级生成的事件(鼠标、按键、调

我有一个很大的组件(比如宽度=4000px,高度=200px),我希望能够在小屏幕上看到它。 我看不到任何简单的包装组件的方法,我的想法如下: 给定一个因子(例如4),通过将子元素包装为4行,该组件的大小将为1000x800。大小请求将被反向转换以重塑子对象,以此类推。在绘制时,组件将使用正确的图形参数调用子对象的绘制(图形)4次,该参数将包装的空间映射到子对象的空间。
但是,我看不出如何处理所有事件:我应该为每个子级生成的事件(PropertyChange)和每个父级生成的事件(鼠标、按键、调整大小等)设置eventlisteners吗?这似乎是一个相当多的映射,我很乐意听到一个更简单的方法来实现这一点…
我对JViewport的实现没有太多的了解,但是也许这可以帮助我,你不这么认为吗

谢谢你的建议

弗雷德里克

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

我是相关组件的设计者(正如建议的那样,我对自己说了一些尖锐的话,但这并没有给我带来任何结果:-)。我实际上在其中添加了“换行代码”,但似乎(非常快!)在组件本身的代码中添加点空间转换、绘制管理会使其变得非常混乱,这就是为什么我认为专用组件是一个更好的解决方案。 此外,制作自定义组件使我能够更轻松地将其作为任何其他组件的“包装器”重用。
想象一下,如果每次使用JScollPane时都必须重新创建类似JScollPane的功能,处理滚动位置、缓冲绘制以及您自己组件中的所有内容:希望您不必这样做

你走错了路。这是组件的内容,而不是您应该考虑的组件本身。如果你想让它变成1000x800,就让它变成那个尺寸。如果组件包含内容(例如文本或其他组件),请适当计算其位置。(您可能无法使用标准布局,最终可能会编写自己的布局)。如果组件的宽度发生变化,您可能需要重新计算布局

不要给油漆打4次电话。如果已经正确计算了组件的布局、子级或文本,则绘制应该可以正常工作

作为对评论的回应:在插入任意换行符的意义上,包装一个直方图不太可能有用。对于图形组件,“断路器”不知道在何处插入断路器;您还将丢失附加到Y轴的所有信息。更好的解决方案是简单地在水平方向上收缩直方图,直到它适合屏幕宽度,或者一个接一个地绘制四个直方图,复制每个直方图的Y轴信息。或者允许水平滚动整个直方图;或者更改轴,以便水平绘制直方图。如果以上这些都不起作用,也许是因为你有数百个直方图条,也许是一种更具互动性的方法,你可以将一些直方图条合并在一起,给出一个概览,并允许用户“深入”到绘图中,以获得更详细的信息


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

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

您似乎建议重新设计子组件,但问题是该组件是某些活动的柱状图,并且具有id在其paintcomponent()中绘制的4000x200px图像。这就是为什么我在寻找一些更通用的方法,将其放在4行中而不触摸它…在我回答此评论之前,通常最好编辑原始问题,而不是添加解释性评论。如果你说你有一个绘制4000x200图像的组件,你不能修改,不允许改变尺寸,然后找出是谁设计了那个部件,并对它们有非常尖锐的描述。[编辑主要问题以完全回答评论]