JavaFX:弹出窗口的透明度仅更改亮度,仍显示为纯色并隐藏基础舞台

问题描述 投票:0回答:1

我有一个主窗口(mainWindow.fxml),在其上面我想显示一个透明度为50%的透明弹出窗口(errorDialog.fxml),以便仍可以在下面看到主窗口的内容。但是,我尝试使errorDialog.fxml中的叠加背景颜色透明,只会导致背景颜色显示为50%的纯灰色,从而完全隐藏了主窗口。

我试图在“ overlay”的style属性以及controllerErrorDialog.java的initialize方法中都设置透明度。

感谢您的任何帮助!

controllerMainWindow.java

package myPackage;
import [...];

public class controllerMainWindow extends AbstractController
{

    @FXML
    private Button btnOpenPopup;
    @FXML
    private BorderPane paneMainWindow;
    //---------------------------------------------------------------------------------------------------
    public void initialize()
    {
    }
    //---------------------------------------------------------------------------------------------------
    @FXML
    public void handleButtonAction(ActionEvent event)
    {
        try {
             if (event.getSource().equals(btnOpenPopup)) {
                FXMLLoader errorLoader = new FXMLLoader();
                errorLoader.setLocation(getClass().getResource("errorDialog.fxml"));
                controllerErrorDialog errorController = new controllerErrorDialog();
                errorLoader.setController(errorController);
                Parent layout;
                layout = errorLoader.load();
                Scene errorScene = new Scene(layout);
                Stage errorStage = new Stage();
                errorStage.initStyle(StageStyle.UNDECORATED);
                errorStage.setMaximized(true);
                errorController.setStage(errorStage);
                if(this.main!=null) {
                    errorStage.initOwner(main.getPrimaryStage());
                }
                errorStage.initModality(Modality.APPLICATION_MODAL);
                errorStage.setScene(errorScene);
                errorStage.showAndWait();
            } 
        }catch (IOException exceptionCockpitSettings) {
            System.out.println("Error when switching to cockpitSettings.");
            exceptionCockpitSettings.printStackTrace();
            return;
        } 
    }
    //---------------------------------------------------------------------------------------------------
}

controllerErrorDialog.java

package myPackage;
import [...];

public class controllerErrorDialog extends AbstractController implements Initializable
{
    @FXML
    private BorderPane overlay;
    private Stage stage = null;
//-------------------------------------------------------------------------------------------------------
    @Override
    public void initialize(URL url, ResourceBundle rb)
    {
        overlay.setStyle("fx-background-color: transparent");
    }
    //---------------------------------------------------------------------------------------------------
    public void setStage(Stage stage) {
        this.stage = stage;
    }
    //---------------------------------------------------------------------------------------------------
}

errorDialog.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import [...]?>

<BorderPane fx:id="overlay" prefWidth="1920" prefHeight="1080" style="-fx-background-color: rgba(0,0,0,0.5)" xmlns:fx="http://javafx.com/fxml">
   <top></top>
   <left></left>
   <center></center>
   <right></right>
   <bottom></bottom>
</BorderPane>
css javafx fxml
1个回答
4
投票

您需要确保:

  1. 场景具有透明背景,并带有errorScene.setFill(Color.TRANSPARENT);
  2. 舞台是透明的,使用errorStage.initStyle(StageStyle.TRANSPARENT);
  3. 除根以外的任何内容(您明确想要透视的内容)具有完全透明的背景

这是一个完整的(尽管不是很友好)示例:

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Random;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 * JavaFX App
 */
public class App extends Application {

    private Random rng = new Random();

    @Override
    public void start(Stage stage) {
        Button createError = new Button("Try something dangerous");
        createError.setOnAction(e -> {
            try {
                throw new Exception("Boom!");
            } catch (Exception exc) {
                BorderPane root = new BorderPane();
                root.setTop(new Label("Error"));
                Label stackTrace = new Label();
                StringWriter sw = new StringWriter();
                exc.printStackTrace(new PrintWriter(sw));

                ScrollPane scroller = new ScrollPane(stackTrace);
                stackTrace.setText(sw.toString());
                root.setCenter(scroller);

                Button close = new Button("Close");
                HBox buttons = createHBox(close);
                root.setBottom(buttons);

                Scene errorScene = new Scene(root, 400, 400);
                errorScene.setFill(Color.TRANSPARENT);
                errorScene.getStylesheets().add(getClass().getResource("transparent.css").toExternalForm());
                Stage errorStage = new Stage();

                close.setOnAction(evt -> errorStage.close());

                errorStage.setScene(errorScene);
                errorStage.initStyle(StageStyle.TRANSPARENT);
                errorStage.initModality(Modality.APPLICATION_MODAL);
                errorStage.initOwner(stage);
                errorStage.show();
            }
        });

        HBox buttons = createHBox(createError);
        BorderPane root = new BorderPane(createContent());
        root.setBottom(buttons);


        Scene scene = new Scene(root, 600, 600);
        stage.setScene(scene);
        stage.show();
    }

    private HBox createHBox(Node... content) {
        HBox buttons = new HBox(content);
        buttons.setAlignment(Pos.CENTER);
        buttons.setPadding(new Insets(2));
        return buttons;
    }

    private Node createContent() {
        Pane pane = new Pane();
        for (int i = 0 ; i < 15 ; i++) {
            Circle circle = new Circle(
                    50 + rng.nextDouble() * 500, 
                    50 + rng.nextDouble() * 500, 
                    50 + rng.nextDouble() * 50, 
                    randomColor());
            pane.getChildren().add(circle);
        }
        return pane ;
    }

    private Color randomColor() {
        return Color.color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 0.5 + 0.25 * rng.nextDouble());
    }

    public static void main(String[] args) {
        launch();
    }

}

transparent.css为:

.root {
  -fx-background-color: #ffffff7f ;
}

.root HBox, .root .scroll-pane, .root .scroll-pane .viewport {
  -fx-background-color: transparent ;
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.