Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXCanvas:如何进行XOR绘制?_Java_Javafx 2_Javafx 8 - Fatal编程技术网

JavaFXCanvas:如何进行XOR绘制?

JavaFXCanvas:如何进行XOR绘制?,java,javafx-2,javafx-8,Java,Javafx 2,Javafx 8,我正在寻找像.setMode(GraphicsContextMode.XOR)这样的方法,但我还没有找到它 在a下方绘制一些形状(实际上仅限于线条),使用两种方法:在每次鼠标拖动事件时完成重画或XOR绘制(不工作): 公共类XorApp扩展应用程序{ 私有静态最终布尔值HAVE_XOR=false; 私有最终画布=新画布(800600); 私有最终列表segments=newlinkedlist(); private/**/线段=null; 专用静态空心绘制(图形上下文g,线条){ g、 斯特罗

我正在寻找像
.setMode(GraphicsContextMode.XOR)
这样的方法,但我还没有找到它

在a下方绘制一些形状(实际上仅限于线条),使用两种方法:在每次鼠标拖动事件时完成重画或XOR绘制(不工作):

公共类XorApp扩展应用程序{
私有静态最终布尔值HAVE_XOR=false;
私有最终画布=新画布(800600);
私有最终列表segments=newlinkedlist();
private/**/线段=null;
专用静态空心绘制(图形上下文g,线条){
g、 斯特罗克林(
line.getStartX()、line.getStartY()、line.getEndX()、line.getEndY());
}
私有无效重绘(GraphicsContext g){
g、 clearRect(0,0,canvas.getWidth(),canvas.getHeight());
用于(最终直线:线段){
画(g,线);
}
}
已启动受保护的空(双x,双y){
如果(段!=null){
结束(段.getEndX(),段.getEndY());
}
线段=新线(x,y,-1.0,-1.0);
}
已拖动受保护的空心(双x,双y){
如果(段==null){
返回;
}
final GraphicsContext g=canvas.getGraphicsContext2D();
if(segment.getEndX()>-1.0){
if(HAVE_XOR){
//由于XOR模式,重新绘制最后一段并将其删除
绘制(g段);
}
否则{
重绘(g);
}
}
段.setEndX(x);
第2段:塞滕迪(y);
绘制(g段);
}
受保护的空隙结束(双x,双y){
(x,y);
段。添加(段);
重画(canvas.getGraphicsContext2D());
段=空;
}
@凌驾
public void start(Stage)引发异常{
if(HAVE_XOR){
//--在这里设置XOR模式--
}
最终边界窗格bp=新边界窗格();
设置中心(画布);
舞台场景(新场景(bp));
stage.centerOnScreen();
stage.show();
setOnMousePressed(新的EventHandler(){
@重写公共无效句柄(MouseeEvent事件){
已启动(event.getX(),event.getY();});
setOnMouseDrawed(新的EventHandler(){
@重写公共无效句柄(MouseeEvent事件){
拖动(event.getX(),event.getY();});
setOnMouseClicked(新的EventHandler(){
@重写公共无效句柄(MouseeEvent事件){
结束(event.getX(),event.getY();});
}
公共静态void main(字符串[]args){
发射(args);
}
}

我在开发一个交互式绘图程序时遇到了同样的问题,该程序希望XORmode在鼠标移动事件期间提供绘图反馈(我在其他库中就是这样做的,包括Swing)。我找到了两个解决办法。第一个(不推荐)是嵌入Swing JPanel,并在需要时通过调用SwingNode.setContent()强制更新,因为在这种情况下invalidate()不起作用。这也需要覆盖paintComponent


更好的解决方案是在StackPane中使用两个JavaFXCanvas对象。一个(在底部)用于在鼠标移动期间绘制临时形状。在绘制临时形状之前,我只需清除它(以背景色绘制一个大矩形)。完成形状后(MouseRelease事件),我再次清除临时画布并将永久对象绘制到顶部画布中。顶部画布保留其默认的透明背景,以便可以看到临时形状。

使用g.setBlendMode进行实验(…)实验完成:枚举值都不会产生XOR结果
public class XorApp extends Application {

   private static final boolean HAVE_XOR = false;

   private final Canvas       canvas   = new Canvas( 800, 600 );
   private final List< Line > segments = new LinkedList<>();
   private /* */ Line         segment  = null;

   private static void draw( GraphicsContext g, Line line ) {
      g.strokeLine(
         line.getStartX(), line.getStartY(), line.getEndX(), line.getEndY());
   }

   private void redrawAll( GraphicsContext g ) {
      g.clearRect( 0, 0, canvas.getWidth(), canvas.getHeight());
      for( final Line line : segments ) {
         draw( g, line );
      }
   }

   protected void started( double x, double y ) {
      if( segment != null ) {
         ended( segment.getEndX(), segment.getEndY());
      }
      segment = new Line( x, y, -1.0, -1.0 );
   }

   protected void dragged( double x, double y ) {
      if( segment == null ) {
         return;
      }
      final GraphicsContext g = canvas.getGraphicsContext2D();
      if( segment.getEndX() > -1.0 ) {
         if( HAVE_XOR ) {
            // Redraw the last segment erase it, thanks to XOR mode
            draw( g, segment );
         }
         else {
            redrawAll( g );
         }
      }
      segment.setEndX( x );
      segment.setEndY( y );
      draw( g, segment );
   }

   protected void ended( double x, double y ) {
      dragged( x, y );
      segments.add( segment );
      redrawAll( canvas.getGraphicsContext2D());
      segment = null;
   }

   @Override
   public void start( Stage stage ) throws Exception {
      if( HAVE_XOR ) {
         //-- SET XOR MODE HERE --
      }
      final BorderPane bp = new BorderPane();
      bp.setCenter( canvas );
      stage.setScene( new Scene( bp ));
      stage.centerOnScreen();
      stage.show();
      canvas.setOnMousePressed( new EventHandler<MouseEvent>() {
         @Override public void handle( MouseEvent event ) {
            started( event.getX(), event.getY()); }});
      canvas.setOnMouseDragged( new EventHandler<MouseEvent>() {
         @Override public void handle( MouseEvent event ) {
            dragged( event.getX(), event.getY()); }});
      canvas.setOnMouseClicked( new EventHandler<MouseEvent>() {
         @Override public void handle( MouseEvent event ) {
            ended( event.getX(), event.getY()); }});
   }

   public static void main( String[] args ) {
      launch( args );
   }
}