【问题标题】:Type casting a shape into a component in Java?在Java中将形状转换为组件?
【发布时间】:2012-01-16 17:51:28
【问题描述】:

如何将形状(如圆角矩形)键入到组件中?

【问题讨论】:

  • 我认为这个问题没有意义......或者至少我不明白。
  • 您可以在组件(如 JPanel)上绘制形状...
  • @LazyCubicleMonkey 是的,我明白这一点。我想要的是将事件侦听器添加到形状。也就是说,当单击形状时,我想执行某些代码。据我所知,您只能向组件添加侦听器。这就是为什么我想将铸型输入组件。有人向我提到了“自定义组件”这个短语,但我在 Java 库中找不到那个类。也许这是某处的一种方法。无论如何,我可以将侦听器设置为保存这些形状的 JPanel,单击鼠标时获取 x 和 y 坐标,并检查它是否在形状中

标签: java types casting components shape


【解决方案1】:

铸造只是将对象的引用更改为不同的表示形式,而不是将对象转换为不同类型的对象。

举一个包含一些组成类的示例,您可以将 Shape 转换为 Square,前提是该 Shape 实际上已经是 Square:

Shape shape = new Square();
Square square = (Square) s; // this will be okay!

这只是暴露了与其关联的对象的现有额外行为,而不是将其转换为正方形。你不能这样做,例如:

Shape shape = new Square();
Circle circle = (Circle) shape; // this will throw a ClassCastException

因为最初的形状实际上并不是一个圆形,并且您可能会暴露对底层对象实际上没有意义的行为(例如 getPerimeter())。

同样,在您的情况下,Shape 不是组件,并且永远不会是,因此您不能将其强制转换为一个。您不能执行强制转换来公开与组件相关的行为(添加侦听器),因为 Shape 类不支持此行为。形状类将不会从接口接收事件消息,即使向其添加侦听器确实有意义,因为它并没有作为组件添加到接口中。假设您正在手动将形状绘制到组件上,因此您应该已经了解它们不是组件层次结构的一部分。

正如您所建议的,假设您已经到达在组件内绘制形状的位置,处理此问题的最佳方法是手动检查相关 MouseEvent 的 x 和 y 坐标是否在每个 Shape 内.

如果您想从一开始就将它们视为组件,则必须为每个形状创建组件,然后使用 LayoutManager 将它们添加到容器中,就像构建界面的其余部分一样。正如您所说,这将涉及创建一个“自定义组件”,而不是一个可以使用的类或方法的名称,而是意味着创建您自己的 Component 子类,它可能会在其中接受一个 Shape 参数构造函数。 Here is an example 我找到了一个自定义按钮组件,它是圆形的,经过一些修改应该可以满足您的需求。

你在上一条评论中基本上回答了你自己的问题,希望这能帮助你理解如何:)。

干杯,希望这会有所帮助。

【讨论】:

    【解决方案2】:

    根据您的进一步反馈,我了解到您只想创建一个自定义组件。

    现在棘手的问题是:您真的想要/需要自定义组件吗?

    通常您只需要扩展 shape 类并实现/覆盖 contains()(您需要的其他方法)和 paint() 方法,您可以在其中绘制您想要的内容。

    然后可以在用于放置形状的容器类(JFame、JPanel、..)中设置侦听器,并使用 shape.contains(point) 处理其上的事件。

    如果您真的需要一个组件,主要优势是它们可以处理事件、与其他组件以及布局管理器交互。

    您可以查看this 的示例。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2013-03-07
      • 2017-02-18
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多