2017-12-12 19 views
4

잘린 노드에 BlendMode (또는 Blend 효과)를 추가 할 수 있습니까? BlendMode가 이미 설정된 노드에 클립을 추가하려고하면 BlendMode가 클립에 의해 무시되고 더 이상 제대로 작동하지 않는 것 같습니다. 일부 예제 코드는 문제를 재현하는 방법 :JavaFX에서 잘린 노드에 BlendMode 추가

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(); 
    } 
} 

답변

2

이 같은 (캐시 사각형을 사용)이 작동

@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

을보십시오! 그러나 이것이 캐시되지 않은 버전이 아니라 왜 작동해야하는지 잘 모르겠습니다. AFAIK, 캐싱은 노드와 각 효과를 다시 랜더링하는 것과 달리 노드의 비트 맵 버전을 메모리에 저장하여 렌더링 속도를 향상시켜야합니다. 캐시 된 버전과 캐시되지 않은 버전간에 이러한 불일치가 JavaFX 자체의 버그를 나타 냅니까? – ddukki

+0

그래, 나는 또한 JAVAFX에 결함이 있다고 생각한다.'swing'에서 이런 일이 발생할 때마다'repaint()'를 호출 할 수 있지만, JavaFx에서는 repaint()를 명시 적으로 호출 할 수 없기 때문에 캐싱을 사용한다. – aKilleR