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

JavaFX中按钮的自定义碰撞形状

叶福
2023-03-14

创建自定义按钮形状很容易完成,但是如何确保新形状也是按钮本身的“碰撞框”?

在本例中,我创建了两个 hexagnol 形状的按钮,并将它们正确对齐。问题是按钮的碰撞框仍然是矩形的,当您将鼠标从上部按钮移动到下部按钮时,您会注意到碰撞框是严格矩形的,并且使自定义形状变得毫无用处。

有没有办法创建自定义碰撞形状或碰撞检查?

完整的工作示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;

public class Test extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane aPane = new Pane();
        aPane.setPrefWidth(100);
        aPane.setPrefHeight(100);

        aPane.getChildren().add(createHexAt(10, 10));
        aPane.getChildren().add(createHexAt(35, 45));

        Scene aScene = new Scene(aPane);

        primaryStage.setScene(aScene);
        primaryStage.show();
    }

    private Button createHexAt(double xPos, double yPos) {
        Button aButton = new Button();
        aButton.setLayoutX(xPos);
        aButton.setLayoutY(yPos);
        aButton.setPrefWidth(50);
        aButton.setPrefHeight(50);
        double[] path = new double[12];
        for (int q = 0; q < 6; q++) {
            double x = Math.cos(Math.PI / 3.0 * q + Math.PI / 2.0);
            double y = Math.sin(Math.PI / 3.0 * q + Math.PI / 2.0);
            path[q * 2] = x;
            path[q * 2 + 1] = y;
        }
        Polygon aPoly = new Polygon(path);
        aButton.setShape(aPoly);
        return aButton;
    }
}

共有1个答案

潘慈
2023-03-14

打电话

aButton.setPickOnBounds(false);

这指示JavaFX仅当鼠标位于非透明像素上时才将鼠标视为位于按钮上,而不是默认值(即鼠标坐标与按钮的矩形边界相交)。

 类似资料:
  • 我不是JavaFX的资深程序员,想请教一下。如何在JavaFX中为按钮制作或设置不同的形状?默认情况下,按钮具有这些圆角矩形形状。我想做一个按钮形状像下面的图片,一个L形按钮。 我已经谷歌了这个话题很多次,但仍然没有找到解决办法。 你能帮助我吗?

  • 我正在尝试做一些碰撞检测。对于这个测试,我使用了一个简单的矩形,并检查它们的,以确定它们是否碰撞。尽管检测没有如预期那样工作。我尝试过使用不同的方法来移动对象(重定位、设置布局X、Y)以及不同的绑定检查(boundsInLocal、BoundsParrent等),但我仍然无法做到这一点。如您所见,检测仅适用于一个对象,即使有三个对象,也只有一个对象检测碰撞。这是一些演示问题的工作代码:

  • 我是JavaFX的新手,在碰撞检测方面遇到了麻烦。我在一个八边形内有一个圆圈,我希望通过从墙壁上反弹来留在八边形内。目前,如果我在尝试移动圆圈时检查按键事件内部的碰撞,它往往会跳来跳去,但是,如果我将碰撞检查放在按键事件之外,则不会发生任何事情。目前,我的代码只检查与左右墙的碰撞。这是我的代码:

  • 问题的核心是,我不能刷新或更改一个场景的节点的内容(这里是TablesMain)从另一个类(这里是NamePriceCell)。 我正在使用主StackPane(TableMainController扩展StackPane)构建和应用程序,其中包含其他节点,其中一些节点是ListView。在一个特定的ListView(比如“readitemslistview”)中,我创建了一个自定义ListCel

  • 当前有三种类型的碰撞形状: 圆形:快速简单的碰撞形状 线段:主要作为静态形状。可以倾斜以便给之一个厚度。 凸多边形:最慢,但却为最灵活的碰撞形状。 如果你愿意,你可以在一个刚体上添加任意数量的形状。这就是为什么两种类型(形状和刚体)是分离开的。这将会给你足够的灵活性来给相同对象的不同区域提供不同的摩擦力、弹性以及回调值。 当创建不同类型的形状的时候,你将永远得到一个cpShape*指针返回。这是因

  • > 标高,同时具有自定义可绘制。 在用户触摸的地方启动涟漪效果。