2016-04-17 70 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