2016-11-04 3 views
0

나는 체스 보드가 있으며 보드에 조각을 추가하려고합니다. 보드의 모든 부분은 Rectangle이므로 조각을 추가하는 가장 좋은 방법은 조각을 얻는 각 Rectangle에 ImagePattern을 추가하는 것입니다. 내가 직면 한 문제는 ImagePattern을 Rectangle에 추가했을 때 ImagePattern이 추가되기 전에 색상이 무엇 이었는지에도 불구하고 그 Rectangle의 배경을 흰색으로 만듭니다. 그래서 내 질문은 ImagePattern 추가 한 후 사각형의 배경색을 유지할 수있는 방법이 있습니까? 데모 용으로 내 코드는 보드에 하나만 추가합니다.Rectangle 배경색을 유지하면서 ImagePattern을 사각형에 추가하는 방법

public class ChessBoard extends Application { 
    GridPane root = new GridPane(); 
    final int size = 8; 

    public void start(Stage primaryStage) { 
    for (int row = 0; row < size; row++) { 
     for (int col = 0; col < size; col++) { 
      Rectangle square = new Rectangle(); 
      Color color; 

      if ((row + col) % 2 == 0) 
       color = Color.WHITE; 
      else 
       color = Color.BLACK; 

      square.setFill(color); 
      root.add(square, col, row); 
      if(row == 4 && col == 3){ 
       Image p = new Image("Peices/Black/0.png"); 
       ImagePattern pat = new ImagePattern(p); 
       square.setFill(pat); 
      } 



      square.widthProperty().bind(root.widthProperty().divide(size)); 
      square.heightProperty().bind(root.heightProperty().divide(size)); 
      square.setOnMouseClicked(e->{ 
       square.setFill(Color.BLUE); 
      }); 
     } 
    } 
    primaryStage.setScene(new Scene(root, 400, 400)); 
    primaryStage.show(); 
} 

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

답변

0

BlendMode로 수행되는 블렌딩을 검색하고 있다고 생각합니다. 예를 들면 다음과 같습니다.

Image p = new Image("Peices/Black/0.png"); 
ImagePattern pat = new ImagePattern(p); 
Rectangle r1 = new Rectangle(); 
r1.setX(50); 
r1.setY(50); 
r1.setWidth(50); 
r1.setHeight(50); 
r1.setFill(pat); 

Rectangle r = new Rectangle(); 
r.setX(50); 
r.setY(50); 
r.setWidth(50); 
r.setHeight(50); 
r.setFill(Color.BLUE); 
r.setBlendMode(BlendMode.ADD); 

내가 아는 한 직접적인 방법은 없습니다.
출처 : https://docs.oracle.com/javase/8/javafx/api/javafx/scene/effect/BlendMode.html

0

아니, 당신은 Rectangle 단일 채우기 이상을 사용할 수 없습니다. 이론적으로 배경이 여러 개인 Region을 사용할 수는 있지만 이는 잘못된 생각 일 수 있습니다. 다른

  • 생기를 하나 개의 필드에서 조각을 드래그

    • : 대부분의 경우 당신은 당신이 조각을 자신의 노드를하지 않는 경우, 작동하지 않습니다 조각에 대한 다음과 같은 기능의 적어도 일부를 할 것입니다 나는 StackPane를 사용하여 백그라운드에서 이사회를 넣어 조각을 배치하는 그것의 위에 Pane를 넣어 권장

    이동합니다. 조각에 ImageView을 사용하기 만하면됩니다.

    예 : 답변

    @Override 
    public void start(Stage primaryStage) { 
        GridPane board = new GridPane(); 
        Region[][] fields = new Region[8][8]; 
        for (int i = 0; i < fields.length; i++) { 
         Region[] flds = fields[i]; 
         for (int j = 0; j < flds.length; j++) { 
          Region field = new Region(); 
          flds[j] = field; 
          field.setBackground(new Background(new BackgroundFill((i + j) % 2 == 0 ? Color.WHITE : Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY))); 
         } 
         board.addRow(i, flds); 
        } 
    
        // use 1/8 of the size of the Grid for each field 
        RowConstraints rowConstraints = new RowConstraints(); 
        rowConstraints.setPercentHeight(100d/8); 
        ColumnConstraints columnConstraints = new ColumnConstraints(); 
        columnConstraints.setPercentWidth(100d/8); 
    
        for (int i = 0; i < 8; i++) { 
         board.getColumnConstraints().add(columnConstraints); 
         board.getRowConstraints().add(rowConstraints); 
        } 
    
        Pane piecePane = new Pane(); 
        StackPane root = new StackPane(board, piecePane); 
    
        NumberBinding boardSize = Bindings.min(root.widthProperty(), root.heightProperty()); 
    
        ImageView queen = new ImageView("https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Chess_qdt45.svg/480px-Chess_qdt45.svg.png"); 
        DropShadow shadow = new DropShadow(BlurType.GAUSSIAN, Color.WHITE, 2, 1, 0, 0); 
    
        // drop shadow for black piece on black field 
        queen.setEffect(shadow); 
    
        // trigger move to topleft field on mouse click 
        queen.setOnMouseClicked(evt -> { 
         Node source = (Node) evt.getSource(); 
         TranslateTransition animation = new TranslateTransition(Duration.seconds(0.5), source); 
         Region targetRegion = fields[0][0]; 
         final PositionChangeListener listener = (PositionChangeListener) source.getUserData(); 
         listener.setField(null); 
         animation.setByX(targetRegion.getLayoutX() - source.getLayoutX()); 
         animation.setByY(targetRegion.getLayoutY() - source.getLayoutY()); 
         animation.setOnFinished(e -> { 
          source.setTranslateX(0); 
          source.setTranslateY(0); 
          listener.setField(targetRegion); 
         }); 
         animation.play(); 
        }); 
    
        PositionChangeListener changeListener = new PositionChangeListener(queen); 
        queen.setUserData(changeListener); 
        changeListener.setField(fields[4][3]); 
    
        // board size should be as large as possible but at most the min of the parent sizes 
        board.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE); 
        board.maxWidthProperty().bind(boardSize); 
        board.maxHeightProperty().bind(boardSize); 
    
        // same size for piecePane 
        piecePane.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE); 
        piecePane.maxWidthProperty().bind(boardSize); 
        piecePane.maxHeightProperty().bind(boardSize); 
    
        // add piece to piecePane 
        piecePane.getChildren().add(queen); 
    
        Scene scene = new Scene(root, 400, 400); 
    
        primaryStage.setScene(scene); 
        primaryStage.show(); 
    } 
    
    private static class PositionChangeListener implements ChangeListener<Bounds> { 
    
        private final ImageView piece; 
    
        public PositionChangeListener(ImageView piece) { 
         this.piece = piece; 
        } 
    
        private Region currentField; 
    
        public void setField(Region newRegion) { 
         // register/unregister listeners to bounds changes of associated field 
         if (currentField != null) { 
          currentField.boundsInParentProperty().removeListener(this); 
         } 
         currentField = newRegion; 
         if (newRegion != null) { 
          newRegion.boundsInParentProperty().addListener(this); 
          changed(null, null, newRegion.getBoundsInParent()); 
         } 
        } 
    
        @Override 
        public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) { 
         // align piece with field 
         piece.setLayoutX(newValue.getMinX()); 
         piece.setLayoutY(newValue.getMinY()); 
         piece.setFitHeight(newValue.getHeight()); 
         piece.setFitWidth(newValue.getWidth()); 
        } 
    
    } 
    
  • +0

    감사합니다. 나는 이것을 잠시 동안 연구하고 있었고 나는 그것을 할 수있을 것이라고 생각하지 않았지만 나는 단지 확신하고 싶었다. StackPane 사용에 대한 여러분의 제안을 정말 좋아합니다. – theAnon

    +0

    fabian, I Haven이 잠시 동안이 코드를 뒤범벅하고 있습니다. 각 개별 사각형에 MouseListener를 추가하고 해당 사각형이 특정 조각에 대한 법적 이동인지 확인하려는 경우 빠른 질문을했습니다. 리스너를 추가하는 가장 좋은 장소가 되겠습니까? 나는 지난 며칠 동안 그것을 알아 내려고 애 쓰고 있었고 시도한 것은 아무것도 작동하지 않는 것 같습니다. 이 예제를 위해 고맙습니다. 이미 톤을 배웠습니다! – theAnon

    관련 문제