【发布时间】:2018-12-30 14:39:36
【问题描述】:
我正在尝试构建一个棋盘游戏界面,用户可以在其中切换多个时代,每个时代都有自己的棋盘。为此,我创建了 4 个不同的板,每个板都在其自己的窗格中,并且我正在切换节点可见性并禁用未使用的节点。我遇到的问题是我用来查看用户点击位置的鼠标事件处理程序仅在顶层工作,即最后一个渲染。即使启用了下面的事件处理程序,它们也不起作用。 这是我写的:
static EventHandler<MouseEvent> eventMouseClickRoad = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
final Shape innerShape = (Shape) (e.getTarget());
System.out.println("click");
Color color = (Color) innerShape.getFill();
if(color.getOpacity() != 1)
{
innerShape.setFill(Color.RED);
//and do the data treatment
}
}
};
public void boardControler(Vector2DList sideList,PointList hexEdge,Pane groupPane,float scaleX, float scaleY, float buttonSize)
{
//set road button
for(Vector2D v : sideList.getVectorList()){
Path mypath = new Path(new MoveTo(v.getP1().getX(),v.getP1().getY()),new LineTo(v.getP2().getX(),v.getP2().getY()));
groupPane.getChildren().add(mypath);
}
for(Vector2D v : sideList.getVectorList()){
float midX=(v.getP1().getX()+v.getP2().getX())/2;
float diffY=v.getP1().getY()-v.getP2().getY();
float diffX=v.getP1().getX()-v.getP2().getX();
Rectangle rectangle = new Rectangle(midX-buttonSize/2,midY-Math.abs(diffY)+buttonSize+(Math.abs(diffY)-scaleY/4),buttonSize,(scaleY/2)-(buttonSize*2));
rectangle.setRotate(Math.toDegrees(Math.atan(diffY/diffX))+90);
rectangle.setFill(Color.TRANSPARENT);
rectangle.addEventFilter(MouseEvent.MOUSE_ENTERED, Event.eventMouseEntered);
rectangle.addEventFilter(MouseEvent.MOUSE_EXITED, Event.eventMouseExit);
rectangle.addEventFilter(MouseEvent.MOUSE_CLICKED, Event.eventMouseClickRoad);
groupPane.getChildren().add(rectangle);
}
}
这就是我用来切换正在使用的板的方法: 禁用
for(Node n : groupPane2.getChildren())
{
n.setDisable(true);
n.setManaged(false);
n.setVisible(false);
}
启用
for(Node n : groupPane2.getChildren())
{
n.setDisable(false);
n.setManaged(true);
n.setVisible(true);
}
【问题讨论】:
-
将节点的可见性设置为
false实际上并不会删除该节点,因此虽然您看不到它,但它仍然在那里接收事件。对于您的功能,我建议使用StackPane来固定您的电路板并根据需要重新排列它们。这样,您就可以始终将“活跃”板保持在顶部。 -
@Zephyr 我的根窗格是堆栈窗格,其他是组窗格,因为我使用笛卡尔坐标定位节点。我怎样才能让它发挥作用?用
StackPanes替换我的组窗格会导致节点定位混乱 -
@Zephyr 隐形节点不接收鼠标事件,见docs。
-
发布minimal reproducible example。请记住,我们不需要整个电路板,只需要它的最小表示。
-
我的立场是正确的。谢谢????
标签: javafx