You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:57