2016-05-20 7 views
0

Salut, je suis censé créer la fonction qui ferait remplir inondation sur un volet contenant Formes utilisant Java. Il est censé se comporter comme MSPaint, je n'ai pas besoin de déplacer plus tard des lignes de rectangles ou d'autres formes. Je pensais convertir Pane en Image et ensuite travailler avec des pixels et puis effacer tous les enfants Panes et l'insérer comme une image, mais je ne peux pas le faire fonctionner. exemple de code:Remplit à l'aide du volet 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? est-ce tout? Ne t'exerce pas trop – gpasch

+0

Eh bien j'espérais qu'au moins quelqu'un me dirait des fonctions de conversion de toile en image que tu pourras modifier et ajouter au volet ... Tu n'as pas besoin de te mettre en colère contre les gens qui essaient d'apprendre quelque chose ... – Therian

+0

Cette question est un peu similaire à: [Y at-il une fonction "remplir" pour les formes arbitraires dans javafx?] (Http://stackoverflow.com/questions/23983465/is-there-a-fill-function-for-arbitrary -shapes-in-javafx) Notez que les remplissages arbitraires comme celui-ci sont souvent plus étroitement associés à un système basé sur un bitmap tel que Canvas qu'un système vectoriel tel que les graphes de scène (ce qui explique en partie le problème de transfert de la région remplie à un noeud de graphe de scène, pour lequel je n'ai pas de conseil sur une solution). – jewelsea

Répondre

1

Got a réussi à faire cette fonction, même si il est un peu en désordre. Donc, pour tout le monde qui devient anxieux à ce sujet:

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

}