JavaFX BlendMode

357
03 июля 2017, 17:03

Создал макет для простого калькулятора. Для создания наложения общего градиента на некоторые элементы использовал следующий код :

Group blendModeGroup = new Group(new Rectangle(scene.getWidth(), scene.getHeight(),
Color.BLACK), grid, colors);
colors.setBlendMode(BlendMode.MULTIPLY);
root.getChildren().add(blendModeGroup);

В grid лежат кнопки, текстбоксы и текст, colors- градиент на всё окно. Но после такого кода теряется доступ мышкой к кнопкам и текстбоксам. Как сделать, чтобы визуальный эффект остался, а доступ к кнопкам не терялся? Вид приложения:

Полный код:

    package application;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.effect.BlendMode;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 500, 200, Color.BLACK);
        primaryStage.setScene(scene);
        Rectangle colors = new Rectangle(scene.getWidth(), scene.getHeight(),
                new LinearGradient(0f, 1f, 1f, 0f, true, CycleMethod.NO_CYCLE, new
                        Stop[]{
                        new Stop(0, Color.web("#f8bd55")),
                        new Stop(0.14, Color.web("#c0fe56")),
                        new Stop(0.28, Color.web("#5dfbc1")),
                        new Stop(0.43, Color.web("#64c2f8")),
                        new Stop(0.57, Color.web("#be4af7")),
                        new Stop(0.71, Color.web("#ed5fc2")),
                        new Stop(0.85, Color.web("#ef504c")),
                        new Stop(1, Color.web("#f2660f")),}));
        colors.widthProperty().bind(scene.widthProperty());
        colors.heightProperty().bind(scene.heightProperty());
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(15);
        grid.setVgap(20);
        grid.setPadding(new Insets(25, 25, 25, 25));
        grid.getColumnConstraints().add(new ColumnConstraints(100));
        grid.getColumnConstraints().add(new ColumnConstraints(30));
        grid.getColumnConstraints().add(new ColumnConstraints(100));
        grid.getColumnConstraints().add(new ColumnConstraints(30));
        grid.getRowConstraints().add(new RowConstraints(30));
        grid.getRowConstraints().add(new RowConstraints(30));
        grid.getRowConstraints().add(new RowConstraints(30));

        Text title = new Text("Calculator");
        title.setFill(Color.WHITE);
        title.setFont(Font.font("Tahoma", FontWeight.NORMAL, 30));
        grid.add(title, 0, 0);

        Button btn1 = new Button("+");
        btn1.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        btn1.setPrefWidth(100);
        grid.add(btn1, 0, 2);

        Button btn2 = new Button("*");
        btn2.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        btn2.setPrefWidth(100);
        grid.add(btn2, 2, 2);

        Text operator = new Text();
        operator.setFill(Color.WHITE);
        operator.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
        grid.add(operator, 1, 1);
        GridPane.setHalignment(operator, HPos.CENTER);

        btn1.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                operator.setText("+");
            }
        });
        btn2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                operator.setText("*");
            }
        });
        Text resulttitle = new Text("=");
        resulttitle.setFill(Color.WHITE);
        resulttitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 40));
        grid.add(resulttitle, 3, 1);
        GridPane.setHalignment(resulttitle, HPos.CENTER);
        Button clrbtn = new Button("Clear");
        clrbtn.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        clrbtn.setPrefWidth(100);
        grid.add(clrbtn, 4, 2);
        TextField number1 = new TextField();
        number1.setFocusTraversable(true);
        grid.add(number1, 0, 1);
        TextField number2 = new TextField();
        number2.setFocusTraversable(true);
        grid.add(number2, 2, 1);
        TextField result = new TextField();
        grid.add(result, 4, 1);

        Group blendModeGroup = new Group(new Rectangle(scene.getWidth(), scene.getHeight(),
                Color.BLACK), grid, colors);
        colors.setBlendMode(BlendMode.MULTIPLY);
        root.getChildren().add(blendModeGroup);

        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Answer 1

Group это контейнер, который никак не размещает компоненты внутри себя. То есть все компоненты помещаются по координате 0,0. В вашем коде две GridPane накладываются друг на друга и поэтому клик мышкой попадают в тут GridPane, которая находится сверху (добавлена позднее). В вашем случае это GridPane с текстовыми полями.

Что бы исправить эту ситуацию вам надо разместить GridPane, так что бы они не перекрывали друг друга.

READ ALSO
Путь к изображению Java

Путь к изображению Java

Здравствуйте! Есть игра на Java, с использованием картинок

204
Как применить цикл к программе и остановить ее одним символом?

Как применить цикл к программе и остановить ее одним символом?

Как сделать чтобы программа запрашивала ввод номера месяца до тех пор, пока пользователь не введёт символ ‘q’

191
Как взять строку из ресурсов? [дубликат]

Как взять строку из ресурсов? [дубликат]

На данный вопрос уже ответили:

168