在Java中键入将形状强制转换为组件?
如何将形状(如圆角矩形)键入到组件中 强制转换只是将对象的引用更改为不同的表示,而不是将对象转换为不同类型的对象 以一些组合类为例,您可以将形状转换为正方形,如果该形状实际上已经是正方形:在Java中键入将形状强制转换为组件?,java,types,casting,components,shape,Java,Types,Casting,Components,Shape,如何将形状(如圆角矩形)键入到组件中 强制转换只是将对象的引用更改为不同的表示,而不是将对象转换为不同类型的对象 以一些组合类为例,您可以将形状转换为正方形,如果该形状实际上已经是正方形: Shape shape = new Square(); Square square = (Square) s; // this will be okay! 这只是暴露与它是正方形相关的对象的现有额外行为,而不是将其转换为正方形。您不能这样做,例如: Shape shape = new Square(); C
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
因为形状实际上并不是一个开始的圆,并且您可能会暴露一些行为(例如getPermission()),而这些行为实际上对底层对象没有意义
同样,在您的情况下,形状不是组件,也永远不会是组件,因此您无法将其转换为组件。无法执行强制转换以公开与组件(添加侦听器)相关的行为,因为Shape类不支持此行为。shape类不会从接口接收事件消息,即使向其添加侦听器是有意义的,因为它尚未作为组件添加到接口中。假设您正在手动将形状绘制到组件上,因此您应该已经了解它们不是组件层次结构的一部分
正如您所建议的,处理此问题的最佳方法是,假设您已经到达在组件内绘制形状的点,手动检查相关MouseeEvent的x和y坐标是否在每个形状内
如果要从一开始就将它们视为组件,则必须为每个形状创建组件,并使用LayoutManager将它们添加到容器中,与构建接口其余部分的方式相同。这将涉及到创建一个“自定义组件”,正如您所说,它不是一个可以使用的类或方法的名称,而是指创建您自己的组件子类,该子类可能在其构造函数中具有形状参数。我发现可以创建一个圆形的自定义按钮组件,经过一些修改应该可以满足您的需要
在上一篇评论中,您基本上回答了自己的大部分问题,希望这能帮助您理解:)
干杯,希望这有帮助。强制转换只是将对象的引用更改为不同的表示形式,而不是将对象转换为不同类型的对象 以一些组合类为例,您可以将形状转换为正方形,如果该形状实际上已经是正方形:
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
因为形状实际上并不是一个开始的圆,并且您可能会暴露一些行为(例如getPermission()),而这些行为实际上对底层对象没有意义
同样,在您的情况下,形状不是组件,也永远不会是组件,因此您无法将其转换为组件。无法执行强制转换以公开与组件(添加侦听器)相关的行为,因为Shape类不支持此行为。shape类不会从接口接收事件消息,即使向其添加侦听器是有意义的,因为它尚未作为组件添加到接口中。假设您正在手动将形状绘制到组件上,因此您应该已经了解它们不是组件层次结构的一部分
正如您所建议的,处理此问题的最佳方法是,假设您已经到达在组件内绘制形状的点,手动检查相关MouseeEvent的x和y坐标是否在每个形状内
如果要从一开始就将它们视为组件,则必须为每个形状创建组件,并使用LayoutManager将它们添加到容器中,与构建接口其余部分的方式相同。这将涉及到创建一个“自定义组件”,正如您所说,它不是一个可以使用的类或方法的名称,而是指创建您自己的组件子类,该子类可能在其构造函数中具有形状参数。我发现可以创建一个圆形的自定义按钮组件,经过一些修改应该可以满足您的需要
在上一篇评论中,您基本上回答了自己的大部分问题,希望这能帮助您理解:)
干杯,希望这能有所帮助。从您的进一步反馈中,我知道您只是想创建一个自定义组件 现在棘手的问题是:您真的想要/需要自定义组件吗 通常,您只需要扩展shape类并在绘制所需内容的位置实现/重写contains()和paint()方法 然后可以在用于放置形状的容器类(JFame、JPanel,…)中设置侦听器,并通过使用shape.contains(point)处理其上的事件 如果您真的需要一个组件,主要的优点是它们可以处理事件、与其他组件交互以及与布局管理器交互
您可以查看这个示例。从您的进一步反馈中,我知道您只想创建一个自定义组件 现在棘手的问题是:您真的想要/需要自定义组件吗 通常,您只需要扩展shape类并在绘制所需内容的位置实现/重写contains()和paint()方法 然后可以在用于放置形状的容器类(JFame、JPanel,…)中设置侦听器,并通过使用shape.contains(point)处理其上的事件 如果你真的需要一个组件,主要的优点是它们可以处理事件