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

时间:2016-01-16 12:16:05

标签: java javafx

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

在这种情况下,我创建了两个六角形按钮并正确对齐它们。问题是按钮的碰撞盒仍然是矩形的,当你将鼠标从上部按钮移动到下部按钮时,你会注意到碰撞盒是严格的矩形,并使自定义形状变得毫无用处。

是否可以创建自定义碰撞形状或碰撞检查?

完整的工作示例:

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 个答案:

答案 0 :(得分:3)

呼叫

aButton.setPickOnBounds(false);

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