在下面的代码中,鼠标单击时不会删除绿色矩形。但是,如果在单击鼠标后调整舞台大小,则会重新绘制场景并且绿色矩形消失。
如果将绿色矩形的大小设置为150/150,则其中一些会立即显示在窗格顶部,并且在鼠标单击时会立即消失。
我的环境:Windows 7 / Java 1.8.0 64位服务器VM版本25.0-b70。
package xschach.client;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main3 extends Application {
public static void main(String[] args) {
Application.launch(Main3.class.getName());
}
public Main3() {}
@Override
public void start(Stage stage) throws Exception {
Pane pane = new Pane();
Rectangle rect = new Rectangle(10, 10, 200, 200);
pane.getChildren().add(rect);
stage.setScene(new Scene(pane, 300, 300));
stage.show();
Rectangle rect2 = new Rectangle(100, 100, 50, 50);
rect2.setFill(Color.GREEN);
pane.getChildren().add(rect2);
pane.setOnMouseClicked(event -> pane.getChildren().remove(rect2));
}
}
答案 0 :(得分:3)
在我看来,这确实是一个错误。
进行一些测试,发生的事情是最后一个节点(在顶部),无论我们有多少,都放在第一个节点的范围内,当它被移除时,它对于场景图是不可见的,它是没有标记为脏,并且没有调用requestLayout()
。
我还发现了其他解决方法。只允许给第一个孩子一些(最小)透明度,它会起作用......
rect.setFill(Color.web("000000FE"));
你总是把这个节点放在第一个节点后面......
pane.setOnMouseClicked(event -> {
rect2.toBack();
pane.getChildren().remove(rect2);
});
无论如何,考虑向Jira提交一个错误。
答案 1 :(得分:0)
我知道这有点晚了,但它可能对某人有帮助。
如果您使用-13
的子级列表上的方法.clear()
,则将强制渲染视图。
因此,我承认这种解决方案相当极端:
pane
答案 2 :(得分:0)
我找到了另一个解决方法。使用toBack()
方法将未擦除的节点移至背面,然后使用toFront()
方法将其移回其位置。这似乎激活了脏机制并正确重新绘制了背景节点。