Создал макет для простого калькулятора. Для создания наложения общего градиента на некоторые элементы использовал следующий код :
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);
}
}
Group это контейнер, который никак не размещает компоненты внутри себя. То есть все компоненты помещаются по координате 0,0. В вашем коде две GridPane накладываются друг на друга и поэтому клик мышкой попадают в тут GridPane, которая находится сверху (добавлена позднее). В вашем случае это GridPane с текстовыми полями.
Что бы исправить эту ситуацию вам надо разместить GridPane, так что бы они не перекрывали друг друга.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Как сделать чтобы программа запрашивала ввод номера месяца до тех пор, пока пользователь не введёт символ ‘q’