【问题标题】:JavaFX Text-Area remove bordersJavaFX Text-Area 删除边框
【发布时间】:2022-01-11 21:33:43
【问题描述】:

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

我遇到的问题是文本区域没有使用警报的全部空间,并且有白色(边框)。

我的代码:

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();

我对应的css表:

.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;  
}

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

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

【问题讨论】:

  • 你可以用ScenicView分析它。
  • 也许警报不适合您,也许 Dialog 或 UTILITY 风格的舞台会更好。
  • 这不会编译。什么是格式对话框?
  • @jewelsea 忽略该部分,仅用于居中按钮

标签: css javafx textarea


【解决方案1】:

正如@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();

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

删除文本区域周围的空白:您可以通过将 TextArea 的填充设置为 0 来删除空白。在 css 文件中包含以下代码。

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

更改空白背景: .text-area.content 样式类位于同一节点上。所以不要在它们之间声明空格

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

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

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

【讨论】:

  • 谢谢,这对我有帮助!但是,如果我不添加按钮,则为按钮保留的空间不会被文本区域使用,我也可以更改吗?
  • 如果您不想使用Dialog 的任何功能,那么使用它是没有意义的(除非您有非常充分的理由)。您可以使用@jewelsea 在他的回答中提到的实用程序阶段。
  • 好的,谢谢!
【解决方案2】:

这是一个与 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);
        }
    }
}

你可以在窗口显示时附加运行:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2015-09-09
    • 2016-04-09
    • 2012-10-02
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多