更改颜色属性

时间:2019-03-22 04:34:05

标签: javafx colors event-handling

我将这段代码转到有一个绿色框的地方,该框周围有按钮,可以更改色调,饱和度并使它更暗和更亮。我在颜色变化方面遇到麻烦。如果有人可以帮助您,将不胜感激。我需要使用事件处理程序来执行此操作。如果有人可以帮助我解决这个问题,将不胜感激。这就是我应该做的。就像我说的那样,我只是遇到了颜色变化的麻烦。

ColorPane:扩展窗格。它将有一个实例变量,即Rectangle。

  • ColorPane的构造函数将
    • 创建矩形并将填充颜色设置为中等:不要太亮或太暗,不要太 饱和或不饱和。
    • 将矩形的宽度和高度绑定到窗格的宽度和高度。 这样,矩形将覆盖整个窗格
    • 将矩形的位置设置为(0,0)
    • 将矩形添加到窗格中(这不是一个孩子,只是因为它是一个实例变量)
  • 将有六种更改矩形颜色的方法。他们每个人都会遵循大致相同 方法:

    1. 获取矩形的Fill并将其投射为Color
    2. 获取填充颜色(颜色中的方法)的色相,饱和度和亮度
    3. 修改方法正在更改的组件
    4. 重新创建颜色(Color.hsb→https://docs.oracle.com/javafx/2/api/javafx/scene/paint/Color.html
    5. 设置矩形的填充
  • 每种方法都会以一种特定的方式改变颜色的一种成分
  • “色相”将色相加30
  • “色调向下”从色调中减去30
  • “饱和度更高”用其平方根1代替饱和度
  • “饱和度较低”用其平方代替饱和度
  • “暗色”将亮度替换为正方形
  • “较浅”用其平方根替换亮度 ShowColors在类中定义ColorPane类型的实例变量。 视觉布局应使用边框窗格作为基础。为顶部和底部创建窗格以容纳按钮。放 中间的ColorPane。您可以通过本书中讨论的任何方式来访问处理程序:内部类,匿名 类或lambda表达式。
package application;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ColorSample extends Application {
    private ColorPane colorPane = new ColorPane();

    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {     
        HBox hBox = new HBox();
        hBox.setSpacing(10);
        hBox.setAlignment(Pos.CENTER);
        Button btDarker = new Button("Darker");
        Button btBrighter = new Button("Brighter");
        hBox.getChildren().add(btDarker);
        hBox.getChildren().add(btBrighter);

        HBox hBox2 = new HBox();
        hBox2.setSpacing(10);
        hBox2.setAlignment(Pos.CENTER);
        Button btMsat = new Button("More Saturated");
        Button btLsat = new Button("Less Saturated");
        hBox2.getChildren().add(btMsat);
        hBox2.getChildren().add(btLsat);

        VBox vBox = new VBox();
        vBox.setSpacing(10);
        vBox.setAlignment(Pos.CENTER);
        Button btHup = new Button("Hue up");
        Button btHdown = new Button("Hue down");
        vBox.getChildren().add(btHup);
        vBox.getChildren().add(btHdown);


        BorderPane borderPane = new BorderPane();

        borderPane.setCenter(colorPane);
        borderPane.setTop(hBox2);
        borderPane.setRight(vBox);
        borderPane.setBottom(hBox);
        BorderPane.setAlignment(hBox, Pos.CENTER);
        BorderPane.setAlignment(vBox, Pos.CENTER_RIGHT);
        BorderPane.setAlignment(hBox2, Pos.TOP_CENTER);

        Scene scene = new Scene(borderPane, 600, 600);
        primaryStage.setTitle("ColorSample");// Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage

    }

    public static void main(String[] args) {
        launch(args);
    }
}
class ColorPane extends StackPane {
    private Rectangle r = new Rectangle(); 

    public ColorPane() {
        getChildren().add(r);
        r.setWidth(520);
        r.setHeight(540);
        r.setFill(Color.GREEN);
        r.setStroke(Color.BLACK);
        r.setX(0);
        r.setY(0);
    }

}

1 个答案:

答案 0 :(得分:0)

  

ColorPane的构造函数将   创建矩形并将填充颜色设置为中等:不要太亮或太暗,不要太饱和或不饱和。   将矩形的宽度和高度绑定到窗格的宽度和高度。这样,矩形将覆盖整个窗格   将矩形的位置设置为(0,0)   将矩形添加到窗格中(这不是一个孩子,仅仅是因为它是一个实例变量)

为此,您需要使用以下代码:

Rectangle rectangle = new Rectangle(0, 0, pane.getPrefWidth(), pane.getPrefHeight());
pane.getChildren().add(rectangle);
  

将有六种方法更改矩形的颜色。他们每个人都将遵循大致相同的方法:

     

1:获取矩形的Fill并将其投射为Color

     

2:获取填充颜色(颜色中的方法)的色相,饱和度和亮度

     

3:修改方法正在更改的组件

     

4:重新创建颜色(Color.hsb)

     

5:设置矩形的填充

要获取颜色,请执行以下操作:

Color color = (Color) rectangle.getFill();

要获取颜色的色相,饱和度和亮度,请执行以下操作:

double hue = color.getHue();
double saturation = color.getSaturation();
double brightness = color.getBrightness();

要设置矩形的填充,请执行以下操作:

rectangle.setFill(color);

色调:

rectangle.setFill(Color.hsb(color.getHue() + 30, color.getSaturation(), color.getBrightness()));

向下调:

rectangle.setFill(Color.hsb(color.getHue() - 30, color.getSaturation(), color.getBrightness()));

更多饱和度:

rectangle.setFill(Color.hsb(color.getHue(), color.getSaturation()^2, color.getBrightness()));

饱和程度较低:

rectangle.setFill(Color.hsb(color.getHue(), Math.sqrt(color.getSaturation()), color.getBrightness()));

更轻:

rectangle.setFill(Color.hsb(color.getHue(), color.getSaturation(), color.getBrightness()^2));

更深:

rectangle.setFill(Color.hsb(color.getHue(), color.getSaturation(), Math.sqrt(color.getBrightness())));