如何在JavaFX中仅使用原始外观关闭按钮创建窗口?

时间:2018-07-25 20:18:08

标签: javafx

我试图找到一种使用StageStyle.DECORATED创建舞台的方法,但是没有最小化或最大化按钮,并且没有关闭按钮的原始外观。我已经尝试过StageStyle.UTILITY,但这看起来很奇怪。

我想要一些像这样的窗口: (这是intelliJ的窗口) IntelliJ Open URL Window

有人对此有想法吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

阶段或对话框的默认StageStyle为StageStyle.DECORATED,阅读StageStyle Documentation可以看到:

  • 已装饰:定义纯白色背景和平台装饰的普通舞台样式。
  • UTILITY :定义具有纯白色背景且用于实用程序窗口的平台装饰最少的舞台样式。

因此,从上面的描述中,您看到阶段有所不同的原因是“最小平台装饰”,根据您或您的客户所使用的平台,它当然可能不会引起注意或不会引起注意。据我所知,没有任何访问或更改装饰的方法,因为操作系统负责显示标题栏和应用程序边框的显示方式。我知道可以实现的唯一方法是创建自己的自定义阶段并应用所需的任何CSS。为此,您必须设置StageStyle.UNDECORATED并从头开始创建标题栏。

尽管在您的特定情况下,您不需要使用舞台。您可以使用不具有最小化和最大化按钮的自定义对话框来实现此目的(至少在Java 8上,但我认为最新版本也是如此),这是一个示例:

import java.util.Optional;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        String input = showInputDialog();
        System.out.println("User Input : " + input);
        Platform.exit();
    }

    private String showInputDialog() {
        // Create the custom dialog.
        Dialog<String> dialog = new Dialog<String>();
        dialog.setTitle("Open URL");

        // Remove the header
        dialog.setHeaderText(null);

        // If you want to add an icon to the Dialog
        // dialog.setGraphic(new
        // ImageView(this.getClass().getResource("logo.png").toExternalForm()));

        // Set the button types.
        ButtonType okButtonType = new ButtonType("OK", ButtonData.OK_DONE);
        dialog.getDialogPane().getButtonTypes().addAll(okButtonType, ButtonType.CANCEL);

        // Create a VBox to store your controls
        VBox mainPane = new VBox(5);

        Label promptLabel = new Label("Specify URL :");

        HBox urlPane = new HBox();
        urlPane.setPadding(new Insets(5));
        urlPane.setAlignment(Pos.CENTER);

        TextField urlField = new TextField();
        Button searchButton = new Button("Search");
        searchButton.setOnAction(e->{
            // open a FileChooser etc and do something
        });

        urlPane.getChildren().addAll(urlField, searchButton);
        mainPane.getChildren().addAll(promptLabel, urlField);

        HBox.setHgrow(urlField, Priority.ALWAYS);

        // Enable/Disable OK button depending on whether a urlField was filled.
        Node confirmationButton = dialog.getDialogPane().lookupButton(okButtonType);
        confirmationButton.disableProperty().bind(urlField.textProperty().isEmpty());

        // set the content of the Dialog
        dialog.getDialogPane().setContent(mainPane);

        // set dialog return value
        dialog.setResultConverter(dialogButton -> {
            if (dialogButton == okButtonType) {
                return urlField.getText();
            }
            return null;
        });

        Optional<String> result = dialog.showAndWait();

        if (result.isPresent()) {
            return result.get();
        } else {
            return null;
        }
    }

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

}

结果:

enter image description here