2016-04-17 71 views
0

我有一個場景圖形,其中包含兩個按鈕,一個用於創建矩形和一個用於創建圓形,還有一個滑塊,移動時會改變形狀對象的顏色。形狀也是可拖動的。不幸的是,顏色滑塊並不像我想要的那樣工作。這個想法是,一旦形狀通過按鈕創建,並且用鼠標點擊形狀,形狀的顏色將根據拖動滑塊的位置(唯一的顏色是紅色)而改變。着色JavaFX形狀

問題是,我不能獨立地顏色和重新着色的形狀,因爲我想要的 - 如果矩形先創建後面的圓圈,我可以顏色的矩形,但不是圓圈。如果我創建的圈子拳頭其次是長方形的,我可以用顏色的圓圈,然後矩形,但在再次選擇了一圈,不能上色它

import javafx.application.Application; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Slider; 
import javafx.stage.Stage; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 


public class SquareRectangle extends Application 
{ 
    private Rectangle selectedRectangle; 
    private Circle selectedCircle; 
    private int red = 255; 
    private int green = 0; 
    private int blue = 0; 

    public static void main(String [] args) 
    { 
     launch(args); 
    } 
    public void start(Stage primaryStage) 
    { 
     Pane root = new Pane(); 
     Scene scene = new Scene(root,800,800); 

     Button Rectangles = new Button("Rectangles"); 
     Button Circles = new Button("Circles"); 
     Slider ColorSlider = new Slider(0,255,0); 
     Circles.setLayoutX(90); 
     ColorSlider.setLayoutY(70); 

     Rectangles.setOnAction(e ->{ 
      Rectangle rect = new Rectangle(); 
      rect.setLayoutX(1080/2); 
      rect.setLayoutY(400); 
      rect.setOnMouseDragged(f ->{ 
       rect.setX(f.getX()); 
       rect.setY(f.getY()); 
      }); 
      rect.setOnMousePressed(g ->{ 
       selectedRectangle = (Rectangle) g.getTarget(); 
      }); 
      root.getChildren().add(rect); 
      rect.setHeight(100); 
      rect.setWidth(200); 
     }); 

     Circles.setOnAction(e ->{ 
      Circle circle = new Circle(300,300,100); 
      circle.setLayoutX(200); 
      circle.setLayoutY(200); 
      circle.setOnMouseDragged(f ->{ 
       circle.setCenterX(f.getX()); 
       circle.setCenterY(f.getY()); 
      }); 
      circle.setOnMousePressed(g ->{ 
       selectedCircle = (Circle) g.getTarget(); 
      }); 
      root.getChildren().add(circle); 
     }); 

     ColorSlider.valueProperty().addListener(
      (ObservableValue<? extends Number> ov,Number curVal, Number newVal)->{ 
        if(selectedRectangle != null){ 
         red = (int) ColorSlider.getValue(); 
         selectedRectangle.setFill(Color.rgb(red,green,blue)); 
       } 
        else if(selectedCircle != null && selectedRectangle == null){ 
         red = (int) ColorSlider.getValue(); 
         selectedCircle.setFill(Color.rgb(red,green,blue)); 
       } 
      }); 


     root.getChildren().addAll(Rectangles,Circles,ColorSlider); 

     primaryStage.setTitle("Shapes"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

} 

我不太肯定我錯過了什麼或做錯了?

回答

0

每當您選擇一個形狀時,該形狀將被設置爲selectedRectangle = (Rectangle) g.getTarget();selectedCircle = (Circle) g.getTarget();

在你改變顏色代碼,它總是會檢查是否矩形不爲空:

if (selectedRectangle != null) { 
    red = (int) ColorSlider.getValue(); 
    selectedRectangle.setFill(Color.rgb(red, green, blue)); 
} else if (selectedCircle != null && selectedRectangle == null) { 
    red = (int) ColorSlider.getValue(); 
    selectedCircle.setFill(Color.rgb(red, green, blue)); 
} 

使用上面的代碼,確保selectedCircle是在第一條語句空(if (selectedRectangle != null && selectedCircle == null) {

另外,你需要確保當選擇一個新形狀的其它形狀被設置爲null:

selectedRectangle = (Rectangle) g.getTarget(); 
selectedCircle = null; 

和副版本sa爲圓。

+0

謝謝!我嘗試了一些東西,但從未完全達到標準。巨大的幫助 – Treeno1