Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaFX上绘制场景的渐变?_Java_Javafx_Javafx 2_Javafx 8 - Fatal编程技术网

如何在JavaFX上绘制场景的渐变?

如何在JavaFX上绘制场景的渐变?,java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,有没有办法在JavaFX舞台的整个场景上绘制从黑色到透明的径向渐变? 我想实现这样的目标: 这里有一个快速的答案,它使用StackPane作为场景根,允许添加一个覆盖层,覆盖层的径向渐变背景从黑色到透明不等 您可以调整径向渐变颜色或半径,例如,使内部颜色color.BLACK.deriveColor(0,1,1,0.2),以更改效果中的高光量和强度 类似这样的渐变也可以在CSS中设置,因此如果您愿意,可以使用CSS而不是Java代码来设计效果 这个实现的输出会受到径向梯度的影响(不确定如何进一

有没有办法在JavaFX舞台的整个场景上绘制从黑色到透明的径向渐变? 我想实现这样的目标:

这里有一个快速的答案,它使用StackPane作为场景根,允许添加一个覆盖层,覆盖层的径向渐变背景从黑色到透明不等

  • 您可以调整径向渐变颜色或半径,例如,使内部颜色
    color.BLACK.deriveColor(0,1,1,0.2)
    ,以更改效果中的高光量和强度
  • 类似这样的渐变也可以在CSS中设置,因此如果您愿意,可以使用CSS而不是Java代码来设计效果
  • 这个实现的输出会受到径向梯度的影响(不确定如何进一步改善),但这取决于您的容差

还有其他方法可以达到与预期效果类似的效果。例如,下面的技术直接将内部阴影和颜色调整应用于根窗格,因此不需要额外的节点

private void makeShadeableByInnerShadow(Scene scene) {
    InnerShadow shade = new InnerShadow();
    shade.setWidth(120);
    shade.setHeight(120);
    shade.setInput(new ColorAdjust(0, 0, -0.3, 0));

    Parent root = scene.getRoot();
    scene.setOnMouseClicked(event -> {
        if (root.getEffect() == null) {
            root.setEffect(shade);
        } else {
            root.setEffect(null);
        }
    });
}


考虑到你的例子,你可以把这个贴在上面。因为你的大部分界面都是巴西葡萄牙语的

答案正是jewelsea发布的内容。但是,当我得到有答案的通知时,我也在回复,我也发布了我的回复

Test.java

package br;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;


    public class Test extends Application {

            public static Stage thisStage;
            @Override
            public void start(Stage stage) throws Exception {
                thisStage = stage;
                Parent root = FXMLLoader.load(getClass().getResource("doc.fxml"));
                Scene scene = new Scene(root);
                scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
                stage.setScene(scene);
                stage.setTitle("Happy Client - Overlay");
                stage.show();

            }
            public static void main(String[] args) {
                launch(args);
            }
    }
package br;
import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;

    public class TestController implements Initializable{
        @FXML Pane mainPane;
        @FXML Pane overlayPane;
        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            overlayPane.getStyleClass().add("grad");
            overlayPane.toFront();
            overlayPane.addEventHandler(MouseEvent.MOUSE_PRESSED,
                    new EventHandler<MouseEvent>(){
                        @Override
                        public void handle(MouseEvent arg0) {
                            overlayPane.toBack();
                        }
            });
        }
    }
TestController.java

package br;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;


    public class Test extends Application {

            public static Stage thisStage;
            @Override
            public void start(Stage stage) throws Exception {
                thisStage = stage;
                Parent root = FXMLLoader.load(getClass().getResource("doc.fxml"));
                Scene scene = new Scene(root);
                scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
                stage.setScene(scene);
                stage.setTitle("Happy Client - Overlay");
                stage.show();

            }
            public static void main(String[] args) {
                launch(args);
            }
    }
package br;
import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;

    public class TestController implements Initializable{
        @FXML Pane mainPane;
        @FXML Pane overlayPane;
        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            overlayPane.getStyleClass().add("grad");
            overlayPane.toFront();
            overlayPane.addEventHandler(MouseEvent.MOUSE_PRESSED,
                    new EventHandler<MouseEvent>(){
                        @Override
                        public void handle(MouseEvent arg0) {
                            overlayPane.toBack();
                        }
            });
        }
    }

请注意,您必须使用StackPane,而不是AnchorPane等其他工具,因为如果您直接在AnchorPane上设置样式,则该样式将不适用于其上方的元素(如表),如下所示:


Thnaks,这正是我所需要的,使用Effect比创建组件和修改布局的组件更容易。