2016-05-20 7 views
0

をこんにちは、私は、洪水がのJavaを使用してシェイプを含むペインに埋めるだろう関数を作成することになっています。それはちょうどMSPaintのように振る舞うはずです、私は後で長方形の線や他の図形を移動する必要はありません。私はペインをイメージに変換してピクセルで作業してから、すべてのペインズの子供をクリアしてイメージとして挿入することを考えていましたが、動作させることはできません。 コード例:洪水は、javaペインを使用して埋める - JAVA

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

public class Paint extends Application { 


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

private Pane pane; 


@Override 
public void start(Stage primaryStage) { 
    pane= new Pane(); 

    primaryStage.setTitle("Fill"); 
    Scene scene = new Scene(pane,500,600); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 


    pane.setOnMousePressed((e)->{ 
     doFill(e.getX(),e.getY()); 
    }); 

    //RECT 1 
    Rectangle rect1=new Rectangle(1,100,200,300); 
    rect1.setStroke(Color.BLACK); 
    rect1.setStrokeWidth(2); 
    rect1.setFill(Color.WHITE); 

    //RECT 2 
    Rectangle rect2=new Rectangle(50,150,200,400); 
    rect2.setStroke(Color.BLACK); 
    rect2.setStrokeWidth(2); 
    rect2.setFill(Color.WHITE); 

    //LINE 
    Line line=new Line(0,0,200,550); 
    rect2.setStroke(Color.BLACK); 
    rect2.setStrokeWidth(2); 


    pane.getChildren().addAll(rect1,rect2,line); 
} 

private void doFill(double eventX, double eventY){ 
    //**TODO** 
} 

}

+0

dofill?それはすべてですか?あなた自身を発揮しないでください – gpasch

+0

私は、編集者が編集してペインに追加できる画像にキャンバスを変換する機能を教えてくれることを少なくとも望んでいました。 何かを学ぼうとする人に怒らせる必要はありません... – Therian

+0

この質問は、似ています:[javafxの任意の図形の "塗りつぶし"関数はありますか?](http://stackoverflow.com/questions/23983465/is-there-a-fill-function-for-任意) -shapes-in-javafx)このような任意の塗りつぶしは、シーングラフなどのベクトルベースのシステムよりもCanvasなどのビットマップベースのシステムとより密接に関連していることに注意してください(これは転送の追加問題がある理由の一部です塗りつぶした領域をシーングラフノードに貼り付けます。これについては、ソリューションについてのアドバイスはありません)。 – jewelsea

答えて

1

ガットもその少し厄介もその機能を行うことができました。だから、これを心配しているすべての人:

private void doFill(double eventX, double eventY,boolean b){ 

    WritableImage i=pane.snapshot(new SnapshotParameters(), null); 
    ArrayList<Integer> pozicie=new ArrayList<Integer>(); 
    ArrayList<Character> strany=new ArrayList<Character>(); 
    pozicie.add((int)eventX); 
    pozicie.add((int)eventY); 
    int c=i.getPixelReader().getColor((int)eventX,(int)eventY).hashCode(); 
    if(c==usedColor.hashCode()){ 
     //System.out.println("same color"); 

     return;} 
    strany.add('a'); 


    while(pozicie.size()!=0){ 
     char strana=strany.remove(0); 
     int x=pozicie.remove(0); 
     int y=pozicie.remove(0); 
     i.getPixelWriter().setColor(x, y, usedColor); 
     if(strana=='d'){ 
      //iba dole 
      if(y<pane.getHeight()-2 && i.getPixelReader().getColor(x, y+1).hashCode()==c){ 
       pozicie.add(x); 
       pozicie.add(y+1); 
       strany.add('d'); 
      } 
     } 
     else if(strana=='u'){ 
      //iba hore 
      if(y>100 && i.getPixelReader().getColor(x, y-1).hashCode()==c){ 
       pozicie.add(x); 
       pozicie.add(y-1); 
       strany.add('u'); 
      } 
     } 
     else{ 


     if(x>2 && i.getPixelReader().getColor(x-1, y).hashCode()==c){ 
      pozicie.add(x-1); 
      pozicie.add(y); 
      strany.add('l'); 
     } 
     if(x<pane.getWidth()-2 && i.getPixelReader().getColor(x+1, y).hashCode()==c){ 
      pozicie.add(x+1); 
      pozicie.add(y); 
      strany.add('r'); 
     } 
     if(y>101 && i.getPixelReader().getColor(x, y-1).hashCode()==c){ 
      pozicie.add(x); 
      pozicie.add(y-1); 
      strany.add('u'); 
     } 
     if(y<pane.getHeight()-2 && i.getPixelReader().getColor(x, y+1).hashCode()==c){ 
      pozicie.add(x); 
      pozicie.add(y+1); 
      strany.add('d'); 
     } 
     } 
    } 
    pane.getChildren().clear(); 
    pane.getChildren().add(new ImageView(i)); 

} 
関連する問題