2012-01-16 51 views

回答

1

铸造被简单地改变对象的参考到一个不同的表示,而不是转换和对象到一个不同类型的对象。

给予一些由类的例子,你可以投一个形状为正方形,当且仅当该形状已经实际上是一个广场:

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参数构造函数。 Here is an example我发现创建一个自定义按钮组件是圆的,其中一些修改应满足您的需求。

你基本上回答了自己的问题大部分在最后的评论,这希望能帮助您了解如何:)。

干杯,希望这有助于。

0

从您的进一步反馈,我明白你只是想创建一个自定义组件。

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

通常情况下,你只需要扩展形状类并实现/覆盖包括()(您需要,其他方法)和paint(),您画出你想要的方式。

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

如果你真的需要一个组件的主要优势是他们能够处理的事件,与其他组件,并与布局管理器进行交互。

你可以检查this的例子。