JavaFX中创建继承Node的多对象哑铃形状(Java/OOP新手求助)
嘿,作为Java和OOP的新手,你这个思路真的很赞——把哑铃拆成三个独立组件来设计,完全贴合面向对象的封装思想!下面我来帮你一步步实现这个继承自JavaFX Node的哑铃类,同时让三个部分保持独立可控。
核心设计思路
我们可以让Dumbbell类继承自JavaFX的Group(它是Node的子类),这样整个哑铃本身就是一个可以直接加入场景的Node。同时在类内部封装三个独立的组件:
- 左右两个
Circle(哑铃片) - 中间的
Rectangle(连接杆)
通过这种方式,既能把哑铃作为一个整体来操作,又能随时单独控制每个部分的属性(比如颜色、大小、位置)。
完整Dumbbell类实现
import javafx.scene.Group; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Rectangle; public class Dumbbell extends Group { // 私有成员:三个独立的组件,外部不能直接修改,但可以通过getter访问 private final Circle leftWeight; private final Circle rightWeight; private final Rectangle bar; // 构造方法:初始化哑铃的位置、尺寸参数 public Dumbbell(double centerX, double centerY, double weightRadius, double barWidth, double barLength) { // 初始化左侧哑铃片:位置在中心左侧barLength/2处 leftWeight = new Circle(centerX - barLength/2, centerY, weightRadius); leftWeight.setFill(Color.GRAY); leftWeight.setStroke(Color.BLACK); leftWeight.setStrokeWidth(2); // 初始化右侧哑铃片:位置在中心右侧barLength/2处 rightWeight = new Circle(centerX + barLength/2, centerY, weightRadius); rightWeight.setFill(Color.GRAY); rightWeight.setStroke(Color.BLACK); rightWeight.setStrokeWidth(2); // 初始化连接杆:从左侧哑铃片中心到右侧,宽度为barWidth bar = new Rectangle(centerX - barLength/2, centerY - barWidth/2, barLength, barWidth); bar.setFill(Color.DARKGRAY); bar.setStroke(Color.BLACK); bar.setStrokeWidth(1); // 把三个组件添加到Group中,这样整体会作为一个Node渲染 getChildren().addAll(leftWeight, bar, rightWeight); } // 为每个组件提供getter方法,方便外部单独控制 public Circle getLeftWeight() { return leftWeight; } public Circle getRightWeight() { return rightWeight; } public Rectangle getBar() { return bar; } // 可选:添加整体操作的便捷方法,比如整体移动哑铃 public void move(double deltaX, double deltaY) { leftWeight.setCenterX(leftWeight.getCenterX() + deltaX); leftWeight.setCenterY(leftWeight.getCenterY() + deltaY); rightWeight.setCenterX(rightWeight.getCenterX() + deltaX); rightWeight.setCenterY(rightWeight.getCenterY() + deltaY); bar.setX(bar.getX() + deltaX); bar.setY(bar.getY() + deltaY); } }
使用示例:单独控制每个组件
下面是一个简单的Main类,展示如何创建哑铃并单独操作它的各个部分:
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { Pane root = new Pane(); // 创建哑铃:中心在(200,200),哑铃片半径30,杆宽10,杆长120 Dumbbell myDumbbell = new Dumbbell(200, 200, 30, 10, 120); // 单独修改右侧哑铃片的颜色为蓝色 myDumbbell.getRightWeight().setFill(Color.BLUE); // 单独拉长连接杆的长度 myDumbbell.getBar().setWidth(150); // 给左侧哑铃片添加点击事件 myDumbbell.getLeftWeight().setOnMouseClicked(e -> { System.out.println("哇,左侧哑铃片被点击了!"); }); // 把哑铃添加到场景中 root.getChildren().add(myDumbbell); Scene scene = new Scene(root, 400, 400); primaryStage.setTitle("我的JavaFX哑铃"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
新手友好提示
- 封装的意义:把三个组件藏在
Dumbbell类内部,外部不用关心它们的初始化细节,但又能通过getter方法灵活控制每个部分,这就是OOP中封装的核心优势。 - 扩展功能:如果需要给哑铃添加旋转、缩放等功能,直接调用对应组件的方法即可,比如
myDumbbell.getLeftWeight().setScaleX(1.5);就能把左侧哑铃片放大1.5倍。 - 模块化注意:如果你的项目是模块化的JavaFX项目,记得在
module-info.java中添加requires javafx.graphics;,否则会出现包导入错误。
内容的提问来源于stack exchange,提问作者Ahmed Elshorbagy
相关产品推荐
相关产品推荐

