Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中键入将形状强制转换为组件?_Java_Types_Casting_Components_Shape - Fatal编程技术网

在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)处理其上的事件

如果你真的需要一个组件,主要的优点是它们可以处理事件