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,有时很难创建,最好尽可能避免覆盖默认填充。
我正在使用带有文本区域的 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,有时很难创建,最好尽可能避免覆盖默认填充。