2017-02-05 2 views
1

я создать форму, и мне нужно расположить на холстеположения фигур на холсте в JavaFX

Class Square нарисовать квадрат и вставить в canvas положения

public class Square{ 
    //calculate the position of the rand column to 
    //draw and insert in the position of the canvas 
    public void drawSquare(int posX, int posY, GraphicsContext gc) { 
     //Square Shadow 
     //gc.rect(posX, posY, w, h); 
     gc.rect(posX + 1, posY + 53, 50, 50); 
     gc.fill(); 
     gc.beginPath(); 
     //Square 
     gc.beginPath(); 
     gc.setFill(Color.WHITE); 
     gc.setStroke(Color.BLACK); 
     gc.setLineWidth(2); 
     //gc.rect(posX, posY, w, h); 
     gc.rect(posX + 1, posY + 53, 48, 48); 
     gc.fill(); 
     gc.stroke(); 

    } 
} 

Нового Canvas instance с height = 450 и width = 600

Canvas canvas = new Canvas(); 
canvas.setHeight(450); 
canvas.setWidth(600); 

и GraphicsContext до draw square

GraphicsContext gc = canvas.getGraphicsContext2D(); 

с этой петли, рисовать 4 rows и 6 columns с square в canvas, и мои сомнения в том, как calculate the position из line и column в draw square и вставить в position холста, когда я называю pieces.drawSquare(i, j, gc); и метод drawSquare создает форму, но сомнений в том, как position их, если это больше, чем одна форма

for (int i = 0; i < 4; i++) { //4 rows 
     for (int j = 0; j < 6; i++) { //6 columns 
     Piece pieces = new Piece(); 
     pieces.drawSquare(i, j, gc); 
     } 

это изображение является примером,

и цель состоит в том, чтобы заполнить 4 строк и 6 столбцов

enter image description here

Я уже подумал о разделении размера и шириной холста размер и ширина формы, но она не работает, может быть, может быть другое решение

+0

Я не мог прочитать все, но то, что я понимаю, что вы хотите, чтобы заполнить ваш холст с прямоугольниками, за исключением первой строки? –

ответ

2

Я думаю, что это может заставить вас начать с нуля

enter image description here

public class Main extends Application { 

private SimpleIntegerProperty rowProperty = new SimpleIntegerProperty(4); //default 
private SimpleIntegerProperty columnProperty = new SimpleIntegerProperty(6);//default 


@Override 
public void start(Stage primaryStage) { 
    try { 
     BorderPane root = new BorderPane(); 
     root.setPadding(new Insets(5)); 
     HBox top; 
     TextField rowField = new TextField(); 
     rowField.setMaxWidth(60); 
     rowField.textProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> observable, 
        String oldValue, String newValue) { 
       try{ rowProperty.setValue(Integer.valueOf(newValue));}catch(NumberFormatException e){} 
      } 
     }); 
     TextField colField = new TextField(); 
     colField.setMaxWidth(60); 
     colField.textProperty().addListener(new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> observable, 
        String oldValue, String newValue) { 
       try{ columnProperty.setValue(Integer.valueOf(newValue));}catch(NumberFormatException e){} 
      } 
     }); 
     top = new HBox(10,new Label("ROW FIELD"),rowField, new Label("COLUMN FIELD"),colField); 
     top.setAlignment(Pos.CENTER); 
     root.setStyle("-fx-background-color: white;"); 
     root.setTop(top); 
     //////////////////////////////////////////////////////////////////////////////////// 
     Canvas canvas = new Canvas(500,400); 
     canvas.getGraphicsContext2D().setFill(Color.BLACK); 
     canvas.getGraphicsContext2D().setStroke(Color.GOLD); 

     ChangeListener<Number> chan = new ChangeListener<Number>() { 
      int space = 2; 
      @Override 
      public void changed(ObservableValue<? extends Number> observable, 
        Number oldValue, Number newValue) { 
       ///i will draw here 
       canvas.getGraphicsContext2D().clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
       int rectW = (int) canvas.getWidth(); 
       rectW = rectW/columnProperty.intValue(); 
       int rectH = (int) canvas.getHeight(); 
       rectH = rectH/rowProperty.intValue(); 

       System.out.println(rectW); 
       System.out.println(rectH); 

       for(int k = 0; k < canvas.getHeight()/rectH; k++){ 
        for(int i =0; i< canvas.getWidth()/rectW; i++){ 
         canvas.getGraphicsContext2D().fillRect((i*rectW) + (i*space), 
           (k*rectH) + (k*space), 
           rectW, rectH); 
        } 
       } 

      } 
     }; 
     rowProperty.addListener(chan); 
     columnProperty.addListener(chan); 
     ////////////////////////////////////////////////////////////////////////////////////////// 

     root.setCenter(canvas); 
     Label l = new Label("ENTER NUMBERS TO FIELDS TO SEE IT"); 
     l.setStyle("-fx-background-color: blueviolet; -fx-text-fill: white;"); 
     l.setPrefWidth(Double.MAX_VALUE); 
     l.setAlignment(Pos.CENTER); 
     root.setBottom(l); 
     Scene scene = new Scene(root,500,500); 
     scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } catch(Exception e) { e.printStackTrace(); } 
} 



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

}

+0

Поблагодарите Elltz, вот и цель: перейти к этой операции 'canvas.getGraphicsContext2D(). FillRect ((i * rectW) + (i * space), (k * rectH) + (k * space), rectW , rectH); 'с' canvas.getHeight()/rectH' и 'canvas.getWidth()/rectW' – DSanches

Смежные вопросы