JavaFX 文本区域去除边框

JavaFX Text-Area remove borders

我正在使用带有文本区域的 JavaFX 警报。

我遇到的问题是文本区域没有使用完整的 space 警报,还有白色(边框)。

我的代码:

TextArea area = new TextArea("");
area.setWrapText(true);
area.setEditable(false);
area.getStylesheets().add(getClass().getResource("/model/app.css").toExternalForm());
Alert alert = new Alert(AlertType.NONE);
alert.getDialogPane().setPrefWidth(750);
alert.getDialogPane().setPrefHeight(800);
alert.getDialogPane().setContent(area);
formatDialog(alert.getDialogPane());
alert.setTitle("Lizenz Info");
Window w = alert.getDialogPane().getScene().getWindow();
w.setOnCloseRequest(e -> {
    alert.hide();
});
w.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
        if (event.getCode() == KeyCode.ESCAPE) {
            w.hide();
        }
    }
});
alert.setResizable(true);
alert.showAndWait();

我对应的csssheet:

.text-area .content {
    -fx-background-color: #4c4c4c;  
}

.text-area {
    -fx-text-fill: #ff8800;
    -fx-font-size: 15.0px;
}

.text-area .scroll-pane {
    -fx-background-color: #4c4c4c;  
}

.text-area .scroll-pane .viewport {
    -fx-background-color: #4c4c4c;  
}

.text-area .scroll-pane .content {
    -fx-background-color: #4c4c4c;  
}

.viewport 和 .scrollpane 上的 .content 没有任何效果。

我希望白色边框消失,或者与背景颜色相同,同时使用整个 space 对话框。有人可以帮忙吗?

正如@jewelsea 所建议的,我认为 Alert 不是正确的选择。您可以使用 Dialog(如以下代码所示)来实现您想要的布局。

Dialog<String> dialog = new Dialog<>();
dialog.setTitle("Lizenz Info");
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK);
dialog.getDialogPane().setContent(area);
dialog.setResizable(true);
dialog.showAndWait();

话虽如此,您可以按以下方式解决现有问题:

去除文本区域周围的白色space:您可以通过将TextArea的填充设置为0来去除白色space。包括以下代码css 文件。

.text-area{
  -fx-padding:0px;
}

更改白色 space 背景: .text-area.content 样式类在同一节点上。因此,与其在它们之间用 space 声明

.text-area .content {
    -fx-background-color: #4c4c4c;
}

你必须声明样式类之间没有 space(在下面的代码中)

.text-area.content {
    -fx-background-color: #4c4c4c;
}

这是一个与 Sai 相似的示例,但使用的是标准阶段。

它使用 UTILITY 样式,但如果您愿意,可以使用不同的样式。

基本上,如果您不想要警报和对话框的额外样式和功能(而且您似乎至少没有给出的示例),那么您可以使用标准阶段来显示您的内容而不是 javafx.control 包中提供的对话框 类。

示例中引用的 alert.css 文件是您问题中的 CSS。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class TextAreaUtility extends Application {

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

    @Override
    public void start(Stage stage) {
        Button showAlert = new Button("Show Alert");
        showAlert.setOnAction(this::showAlert);

        stage.setScene(new Scene(showAlert));
        stage.show();
    }

    private void showAlert(ActionEvent e) {
        TextArea textArea = new TextArea("");
        textArea.setWrapText(true);
        textArea.setEditable(false);

        Scene scene = new Scene(textArea, 750, 800);
        scene.getStylesheets().add(
                TextAreaUtility.class.getResource(
                        "alert.css"
                ).toExternalForm()
        );

        Stage utility = new Stage(StageStyle.UTILITY);
        utility.initOwner(((Button) e.getSource()).getScene().getWindow());
        utility.initModality(Modality.APPLICATION_MODAL);
        utility.setTitle("Alert Title");
        utility.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
            if (event.getCode() == KeyCode.ESCAPE) {
                utility.hide();
            }
        });
        utility.setResizable(true);
        utility.setScene(scene);
        utility.showAndWait();
    }
}

调试节点和样式信息

如果您想查看场景图中的节点和样式名称并且您没有使用 ScenicView 之类的工具,快速调试功能是:

private void logChildren(Node n, int lvl) {
    for (int i = 0; i < lvl; i++) {
        System.out.print("  ");
    }
    System.out.println(n + ", " + n.getLayoutBounds());

    if (n instanceof Parent) {
        for (Node c: ((Parent) n).getChildrenUnmodifiable()) {
            logChildren(c, lvl+1);
        }
    }
}

显示 window 时可以附加到 运行:

w.setOnShown(se -> logChildren(alert.getDialogPane().getScene().getRoot(), 0));

当您在标准对话框中 运行 执行此操作时,您会在场景图中看到相当多的节点以及附加样式,您可以在 JavaFX SDK 的 modena.css 文件中找到这些样式。您还会看到一些与您的文本区域无关的布局边界框具有宽度和高度。

默认情况下,这些对话框样式附加了填充,这就是您在 TextArea 周围看到填充的原因。填充不在文本区域中,而是在对话框中包含它的内容区域中。要摆脱它,您需要在自定义 CSS 中设置填充以覆盖默认值。我没有 CSS,有时很难创建,最好尽可能避免覆盖默认填充。