如何在JavaFX上绘制场景的渐变?
有没有办法在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代码来设计效果 这个实现的输出会受到径向梯度的影响(不确定如何进一
这里有一个快速的答案,它使用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比创建组件和修改布局的组件更容易。