【问题标题】:Setting the pivot point of a JPanel to its center将 JPanel 的枢轴点设置为其中心
【发布时间】:2013-08-13 18:25:12
【问题描述】:

我正在构建一个 Java 应用程序,该应用程序将具有两个需要用户单击的随机大小的圆圈。将测量单击第一个和第二个圆圈之间的时间。不幸的是,由于我是 Java 新手,所以事情对我来说很慢。目前我的应用程序使用 System.nanoTime() 绘制圆圈并测量点击之间的时间,但现在我遇到了问题。

因为圆圈需要彼此相距固定距离,所以我想使用圆圈的中心作为原点。所以基本上我希望能够为圆提供坐标,以便圆的中心应该在这些坐标处。然后圆之间的距离描述了中心之间的距离。我的圈子目前嵌入到 JPanel 中,但如果我设置 JPanel 的位置,它会将左上角移动到该位置。

当然,我已经完成了一些搜索阅读,我可能需要使用我在paintComponent() 中尝试过的 AffineTransform 或 Graphics2D.translate() 但这有点令人困惑,所以我尝试覆盖 setlocation 并减去从位置的半径。它有点工作,但它不是最干净的解决方案。谁能给我一些关于如何做到这一点的指示?

提前致谢。

【问题讨论】:

  • 你能提供一些代码吗?我不确定你做了什么。为什么需要覆盖 setLocation 才能在正确的位置绘制圆圈?

标签: java swing jpanel awt shape


【解决方案1】:

如果我理解问题陈述,所有这样的圆对都将位于以封闭面板为中心的圆的相对两侧,如here 所示。只需选择一个随机的 0 ≤ θ

顺便说一句,该示例使用setPreferredSize() 来确定绘图面板的尺寸,但您可能想要覆盖getPreferredSize()

附录:example 使用fillOval() 来渲染圆圈,但您可以将draw() 与任何想要的Shape 一起使用;后者提供了几种适合命中测试的contains()方法,如here所述。

【讨论】:

    【解决方案2】:

    你有两个圆心的坐标 (x1, y1) 和 (x2, y2)。 半径的大小是随机的。 获得 r1 和 r2 两者的半径后,只需将它们定位在 (x1-r1, y1-r1) 和 (x2-r2, y2-r2)。

    你可以使用java.awt.Point来表示中心,并使用

    center.translate(-radius, -radius)
    

    并使用新的翻译值作为绘图的位置。

    也许您认为这不是一个干净的解决方案,但为什么不呢? Java中的所有内容都是通过为位置提供左上角来绘制的,因此使用不干净的中心:)。 通过执行 -radius 计算左上角是干净的:)

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2021-01-31
      • 2015-07-18
      • 1970-01-01
      • 2013-06-06
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      相关资源
      最近更新 更多