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

JavaFx按钮事件处理程序来移动形状

梁丘经艺
2023-03-14

上周我刚开始使用JavaFx,但在尝试在窗格中设置圆圈以响应按钮事件处理程序时遇到了问题。我有左、右、上、下名称的按钮设置,按下时应该会在窗格内移动圆圈。我的问题是我根本无法让圆圈响应我的事件处理程序。我看到了另一个包含按键移动圆圈的教程,我正在尝试类似的东西,但用按钮代替。任何帮助我走向正确方向的帮助都将非常感谢。

package movingball;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class MovingBall extends Application{
  private CirclePane circlePane = new CirclePane();


@Override
public void start(Stage primaryStage) {
    StackPane pane = new StackPane();
    Circle circle = new Circle(50);
    circle.setStroke(Color.BLACK);
    circle.setFill(Color.WHITE);
    pane.getChildren().add(circle);

    HBox hBox = new HBox();
    hBox.setSpacing(10);
    hBox.setAlignment(Pos.CENTER);
    Button btLeft = new Button("Left");
    Button btRight = new Button("Right");
    Button btUp = new Button("Up");
    Button btDown = new Button("Down");
    hBox.getChildren().addAll(btLeft, btRight, btUp, btDown);

    btLeft.setOnAction(new LeftHandler());
    btRight.setOnAction(new RightHandler());
    btUp.setOnAction(new UpHandler());
    btDown.setOnAction(new DownHandler());


    BorderPane borderPane = new BorderPane();
    borderPane.setCenter(pane);
    borderPane.setBottom(hBox);
    BorderPane.setAlignment(hBox, Pos.CENTER);

    // Create a scene and place it in the stage
    Scene scene = new Scene(borderPane, 500, 350);
    primaryStage.setTitle("Move the Ball"); // Set the stage title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
  }



class LeftHandler implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        circlePane.left();

    }

}

class RightHandler implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        circlePane.right();

    }

}

class UpHandler implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        circlePane.up();

    }

}

class DownHandler implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        circlePane.down();

    }

}

class CirclePane extends StackPane {
    private Circle circle = new Circle(50);

    public CirclePane() {
        getChildren().add(circle);
        circle.setStroke(Color.BLACK);
        circle.setFill(Color.WHITE);
    }

    public void left() {
        circle.setCenterX(circle.getCenterX() - 10);
    }

    public void right() {
        circle.setCenterX(circle.getCenterX() + 10);
    }

    public void up() {
        circle.setCenterY(circle.getCenterY() - 10);
    }

    public void down() {
        circle.setCenterY(circle.getCenterY() + 10);
    }
}


  public static void main(String[] args) {
    launch(args);
  }

}

共有1个答案

包丁雨
2023-03-14

第一个问题是您正在移动CirclePane,但它不是您的场景的一部分。删除您在start(...)方法中创建的窗格,并将CirclePane放在BorderPane的中心。

第二个问题是,堆栈窗格将使圆居中,调整其坐标系,使其在圆移动时保持居中。因此,将圆窗格(CirclePane)作为窗格(Pane)的子类,而不是堆栈窗格(StackPane)。或者,您可以调用circle。setManaged(假)防止堆叠窗格定位圆圈。

 类似资料:
  • 我仍然是Java和JavaFX的初学者,目前我正在努力寻找一种方法来阻止/中断单击按钮时发生的事件。因此,我正在构建一个程序,将产品(类)添加到TableView中。到目前为止,一切正常,产品添加成功,其参数由我的自定义函数检查,用户是否在名称/价格/金额字段中分别输入了字符串/双精度/整数值。 在我的检查功能中,当输入的值不正确时,也会打印一个错误,但我也希望这样做,以便在输入不正确的值时,3个

  • 我的一段代码 下一条语句的错误为

  • 问题内容: 我在JavaFX中有一个舞台,可以通过多种方式关闭该舞台,方法是单击红色(X)或通过一个调用 无论舞台如何关闭,我都希望在舞台关闭之前(或之后)执行操作。 如果我使用以下代码: 然后当我单击(X)时调用处理程序,但当我调用 不同之处在于,他希望在整个应用程序关闭时调用处理程序,因此可以覆盖的方法。但是,我并没有关闭整个应用程序,只是一个阶段。并且没有重写的方法。 谢谢你的帮助。 问题答

  • 我在JavaFX中有一个阶段,可以通过多种方式关闭,通过单击红色(X)或通过调用的按钮 无论舞台如何关闭,我都想在舞台关闭之前(或关闭时)执行一个动作。 如果我使用以下代码: 然后,当我单击(X)时调用处理程序,但当我调用<code>myStage.close()</code>时不会调用 这与这个问题讨论的问题相同(有一个关键区别):JavaFX:Stage-close-handler 不同之处在

  • 我正在开发一个需要

  • 当我运行我的JavaFX程序时,我的第一个按钮总是被选中(见周围的蓝线):图片形式开始 当我使用箭头键将播放器选项设置为左或右时,左或右按钮将被选中: 在我按下右箭头 没有选中任何按钮我如何运行程序