JavaFX 在节点周围显示选项
JavaFX Show options around a node
我试图实现一个自定义上下文菜单,菜单项将出现在节点周围,想法如下,围绕目标节点绘制一个虚拟圆,并计算圆的周长,第一个菜单项将在目标节点的顶部,其余的将在每个菜单项之间以相等的距离分布,,,,我没有写任何代码,因为我至少不知道如何开始,,,plz帮助 ?
也许这张图片会更好地解释
万一有人感兴趣,我设法做到了,但是代码有点脏:
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
/**
* @author Asendar
*
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class RadialMenuFactory {
public static final RadialMenuFactory instance = new RadialMenuFactory();
public StackPane construct(int itemsCount, int radius) {
StackPane pane = new StackPane();
double pheta = 270;
int counter = 0;
while (counter != itemsCount) {
double x = radius * Math.cos(Math.toRadians(pheta));
double y = radius * Math.sin(Math.toRadians(pheta));
Button btn = new Button("btn");
btn.setTranslateX(x);
btn.setTranslateY(y);
pane.getChildren().addAll(btn);
pheta += 360 / itemsCount;
pheta %= 360;
counter++;
}
pane.setMinHeight(300);
pane.setMinWidth(300);
return pane;
}
}
我试图实现一个自定义上下文菜单,菜单项将出现在节点周围,想法如下,围绕目标节点绘制一个虚拟圆,并计算圆的周长,第一个菜单项将在目标节点的顶部,其余的将在每个菜单项之间以相等的距离分布,,,,我没有写任何代码,因为我至少不知道如何开始,,,plz帮助 ?
也许这张图片会更好地解释
万一有人感兴趣,我设法做到了,但是代码有点脏:
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
/**
* @author Asendar
*
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class RadialMenuFactory {
public static final RadialMenuFactory instance = new RadialMenuFactory();
public StackPane construct(int itemsCount, int radius) {
StackPane pane = new StackPane();
double pheta = 270;
int counter = 0;
while (counter != itemsCount) {
double x = radius * Math.cos(Math.toRadians(pheta));
double y = radius * Math.sin(Math.toRadians(pheta));
Button btn = new Button("btn");
btn.setTranslateX(x);
btn.setTranslateY(y);
pane.getChildren().addAll(btn);
pheta += 360 / itemsCount;
pheta %= 360;
counter++;
}
pane.setMinHeight(300);
pane.setMinWidth(300);
return pane;
}
}