删除在另一个对象上绘制的对象时,JavaFX不会重绘

时间:2014-11-10 07:06:09

标签: javafx rendering

在下面的代码中,鼠标单击时不会删除绿色矩形。但是,如果在单击鼠标后调整舞台大小,则会重新绘制场景并且绿色矩形消失。

如果将绿色矩形的大小设置为150/150,则其中一些会立即显示在窗格顶部,并且在鼠标单击时会立即消失。

  • 这是一个JavaFX错误,还是我忽略了什么?
  • 如何在鼠标单击时使矩形消失?

我的环境: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));
    }
}

3 个答案:

答案 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()方法将其移回其位置。这似乎激活了脏机制并正确重新绘制了背景节点。