如何?用Java绘制自定义复合对象

时间:2011-11-01 16:54:02

标签: java swing paint composite

我试图用java制作棋盘游戏,但我遇到了以下问题。

我想创建一个可以在jpanel中绘制的对象。我们将此对象命名为Board。这个板我希望它是其他板的复合对象。因此,当我调用板的(让我们称之为)paint()方法时,为了正确绘制,它必须调用自己绘制它并调用其子板的paint()方法等。 我知道这就像一个已经实现的行为(有人可以说......只是在Jpanel中创建一个Jpanel)但不同的是,对于board对象,我希望能够将它拖放到Jpanel中的任何位置。此外,Jpanel可能包含许多可以在其中任意位置拖放的板(也可以重叠)。所以这种行为限制我使用Java swing组件,因为它们都使用了我想要的布局。

最后,当我向电路板添加电路板对象时,我使用的电源线想要相对于母板,而不是相对于Jpanel的电路板。 (即当我将板B添加到板A,并且我想将板B添加到(x,y)=(10,10)时,这些坐标相对于A)的位置

这有什么办法吗?我不是在寻找完整的例子,只是为了一般的想法(最好干净!)

PS。我已经实现了几乎可行的东西。我的实现中的问题是,图形g,用于绘制的类Board是从JPanel获取的,x,y coords是相对于所有板的JPanel(如果添加了板,则不是父板)到母委员会,而不是直接到JPanel)。

我不知道这是不是可以熔化,但我想通过起始坐标(0,0)将叶片实际上用自动绘制它自己的成像(0,0)在JPanel中以某种方式被转换为(x,y)取决于实际在董事会的Jpanel中的位置。

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您可以考虑使用MovingWindowsResizingComponents。我过去使用null LayoutManager做了类似的事情,但这是一个坏主意。

当您需要绝对定位组件或明确设置其大小时,有几个问题。

以下是您可能会考虑的两个主题:

  1. The first讨论了类似的问题。
  2. The second解释了为什么不能直接在Component上使用setXXXSize方法。
  3. 理解这些解决方案的关键是,您永远不应该从应用程序代码中设置组件的大小。如果你需要调整大小,你需要在框架上进行调整。