java - 如何?在 Java 中绘制自定义复合对象

标签 java swing paint composite

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

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

最后,当我将板对象添加到板时,我使用的坐标是相对于父板而不是 Jpanel 的。 (即当我将板 B 添加到板 A 时,我想将板 B 添加到 (x,y)=(10,10) ,这些坐标是相对于 A 的位置)

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

附言。我已经实现了一些几乎可以工作的东西。我的实现中的问题是 Graphics g ,用于绘制的类 Board 是从 JPanel 中获取的,并且 x,y 坐标是相对于所有 Boards 的 JPanel (如果添加了董事会,则不是父董事会)到父板而不是直接到 JPanel)。

我不知道这是否可熔,但我想象叶子板正在用起始坐标 (0,0) 自动绘制它自己,这在 JPanel 中以某种方式转换为 (x,y),具体取决于实际在板的 Jpanel 中的位置。

谢谢!

最佳答案

我想你可以考虑使用 MovingWindowsResizingComponents .我过去曾使用 null LayoutManager 做过类似的事情,但这是个坏主意。

当您需要绝对定位组件或显式设置它们的大小时,会出现几个问题。

这里有 2 个您可能会感兴趣的话题:

  1. The first讨论类似的问题。
  2. The second解释了为什么不能直接在组件上使用 setXXXSize 方法。

理解这些解决方案的关键是您永远不应该从应用程序代码中设置组件的大小。如果您需要调整某些内容的大小,则必须在框架上进行。

关于java - 如何?在 Java 中绘制自定义复合对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7969919/

相关文章:

java - 让 Android Studio + Gradle + Annotations 协同工作

java - 从输入 IST 日期和时间获取加拿大/东部偏移量

java - 如何在Java中实现一个组合框,为所选项目输出一定的数字?

java - 我们如何才能知道与 documentEvent 中的文档关联的 JeditorPane

java - 自定义UI绘制问题

c# - 滞后的截图工具

android - 在Android Canvas 透明矩形上绘制双色正方形

java - 关于使用 Java 的 XPath

java - 写一个算法来找到最大值

java - 如何通过jtextfield替换文件中的一行?