当前位置: 首页 > 知识库问答 >
问题:

自定义对象JavaFX布局

高宏峻
2023-03-14

第一次使用JavaFX,所以我对setLayout()/getLayout()方法有一个问题。我在做一个弹跳球项目。首先,我使用circle对象创建球,但由于需要传递更多参数,我决定构建自己的球类(double x,double y,double dx,double dy,double size)。这是我以前使用circle时使用的代码

ball.setLayoutX(ball.getLayoutX() + dx);
ball.setLayoutY(ball.getLayoutY() + dy);

final Bounds bounds = canvas.getBoundsInLocal();
boolean right = ball.getLayoutX() >= (bounds.getMaxX() - ball.getRadius());
boolean left = ball.getLayoutX() <= (bounds.getMinX() + ball.getRadius());
boolean bottom = ball.getLayoutY() >= (bounds.getMaxY() - ball.getRadius());
boolean top = ball.getLayoutY() <= (bounds.getMinY() + ball.getRadius());

if (right || left) {
    dx *= -1;
}
if (bottom || top) {
    dy *= -1;
}

当将时间线关键帧事件处理程序放入时间线中时,就会使圆圈“球”弹出墙壁。现在,我正试图弄清楚如何使用ballball来实现这一点,因为在使用我自己的对象时,无法解析getLayout()setLayout()getRadius()方法。如何处理这个/构建自己的setLayout()等?

共有1个答案

秦建元
2023-03-14

只需将所有逻辑放在ball类中:

public class Ball {

    private final Circle view ;

    private double dx ;
    private double dy ;

    public Ball(double size) {
        view = new Circle(size);
    }

    public void move() {

        Parent canvas = view.getParent();

        view.setLayoutX(view.getLayoutX() + dx);
        view.setLayoutY(view.getLayoutY() + dy);

        final Bounds bounds = canvas.getBoundsInLocal();
        boolean right = view.getLayoutX() >= (bounds.getMaxX() - view.getRadius());
        boolean left = view.getLayoutX() <= (bounds.getMinX() + view.getRadius());
        boolean bottom = view.getLayoutY() >= (bounds.getMaxY() - view.getRadius());
        boolean top = view.getLayoutY() <= (bounds.getMinY() + view.getRadius());

        if (right || left) {
            dx *= -1;
        }
        if (bottom || top) {
            dy *= -1;
        }
    }

    public Node getView() {
        return view ;
    }
}

现在您可以创建一个新的球,调用canvas.getChildrens().add(ball.getView()),而您的时间线所要做的就是调用ball.Move()

另一种方法是从ball类公开适当的方法:

public double getX() {
    return view.getLayoutX();
}

public void setX(double x) {
    view.setLayoutX(x);
}

这个演示使用相同的思想有一个稍微复杂一些的实现。

 类似资料:
  • 我的代码中有以下扩展的JavaFX对象: 它使用我编写的这个客户Java类来跟踪Tile位置: 现在,我想构建一个场景(通过JavaFX场景生成器),它使用一个网格窗格,每个单元格中都有一个平铺对象。我决定首先在scene Builder中构建一个场景,使用JavaFX矩形对象而不是平铺,然后手动编辑.fxml文件并将其中的矩形更改为平铺对象。问题是Intellij现在告诉我FXML文件中的平铺对

  • 我正在尝试使用基于自定义列表的自定义创建一个自定义。 自定义对象是名为的类名,其中包含一些用于消息内容、收件人、时间戳和状态(读取、发送等)的字段。 在看了这个问题:用FXML在JavaFX中定制ListView之后,我成功地做到了: null 现在,ConversationCell类: 我不能显示ConversationCellController,但我所能说的是,这是我(在其构造函数中)加载设

  • 我正在开发一个应用程序,有必要将节点布置在彼此之外(或彼此顶部等)。但是,此布局只是初始布局,用户可以任意移动这些节点。在JavaFX中,如何以正确的方式实现这一点?我将用一个简单的例子来解释我的问题: 假设我有两个矩形,想把矩形2放在矩形1的右边。 在这种情况下,JavaFX还没有确定rect1的宽度,它将为零。直观地说,我会执行一个调用,让JavaFX绘制rect1,从而确定其宽度,然后添加r

  • 我正在努力找出如何使用Java流从对象值等于x的自定义对象列表中收集自定义对象。 这没有编译,但我不认为我离得很远--有人能指出我在哪里出错吗?

  • 问题内容: 说我的课很简单 我希望将此类s 的集合存储在People类的属性中,该属性是类型为Person的数组 也许我做到这一点如下 问题:请问我如何检查people.list是否包含实例alex? 我很想尝试的简单尝试 称一个错误 问题答案: 有两个功能: 编译器在抱怨是因为编译器知道不是,因此需要一个谓词,但不是谓词。 如果阵列中的人员是(不是),则可以使用: 由于它们不相等,因此可以将第二

  • 问题内容: 我对Java,JavaFX和编程一般还是有点陌生​​,但是我遇到的问题困扰着我。 在大多数教程中,我查找了有关填充ListView(更具体地说,使用ObservableArrayList)的方法,最简单的方法是从String的ObservableList中创建它,如下所示: 但是我不想使用字符串。我想使用我制作的名为Words的自定义对象: 每个Word对象只有两个属性:wordStr