在JavaFX中,向裁剪节点添加混合模式

4

有没有办法在已经裁剪的节点上添加混合模式(或混合效果)?如果我尝试将剪辑应用于已经设置了混合模式的节点,那么剪辑会覆盖混合模式并且无法正常工作。以下是一些示例代码以重现问题:

package display.fx.demo;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.BlendMode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class BlendModeClipProblem extends Application {
    public Rectangle blueRect = new Rectangle(0, 0, 30, 30);
    public Rectangle redRect = new Rectangle(15, 15, 30, 30);

    @Override
    public void start(final Stage stage)
            throws Exception {
        final Pane pane = new Pane();
        final Scene scene = new Scene(pane);
        pane.getChildren().add(blueRect);
        pane.getChildren().add(redRect);

        blueRect.setFill(Color.BLUE);
        redRect.setFill(Color.RED);

        redRect.setBlendMode(BlendMode.ADD);

        // Comment this next line to see blending
        redRect.setClip(new Rectangle(15, 15, 20, 20));

        stage.setScene(scene);
        stage.show();
    }
}
1个回答

3
尝试使用缓存矩形来实现类似以下示例的功能:
@Override
    public void start(final Stage stage)
            throws Exception {
        final Pane pane = new Pane();
        final Scene scene = new Scene(pane);
        pane.getChildren().add(blueRect);
        pane.getChildren().add(redRect);

        blueRect.setFill(Color.BLUE);
        redRect.setFill(Color.RED);

        redRect.setBlendMode(BlendMode.ADD);

        redRect.setCache(true);
        redRect.setCacheHint(CacheHint.QUALITY);

        redRect.setClip(new Rectangle(15, 15, 20, 20));

        stage.setScene(scene);
        stage.show();
    }

1
这个可以工作!但是,我不确定为什么这个可以工作而非缓存版本。据我所知,缓存应该只是通过在内存中存储节点的位图版本来增强渲染速度,而不是重新渲染节点和每个效果。缓存版本和非缓存版本之间的这种不一致是否表明JavaFX本身存在错误? - ddukki
1
是的,我也认为JAVAFX中存在故障,每当在swing中发生这种情况时,我们可以调用repaint(),但在JavaFx中,我使用缓存,因为我们不能显式地调用repaint()。 - Akila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接