Oundroni Asked: 2020-02-17 06:44:25 +0800 CST 2020-02-17 06:44:25 +0800 CST 2020-02-17 06:44:25 +0800 CST 获取 JavaFX 控件的背景颜色 772 我想从 javaFX 代码中读取控件的背景颜色,然后对其应用透明度。我一直在寻找信息,但我不清楚。没有方法getBackgroundColor(),但如果getBackground()我迷路了,有什么想法吗? javafx 2 Answers Voted J. Valencia 2020-02-17T07:21:42+08:002020-02-17T07:21:42+08:00 看看这是否是您在此链接中需要的:带有阴影边缘的窗口 需要仔细观察的部分是: stage.initStyle(StageStyle.TRANSPARENT); 是 // Establecer el color de relleno del Scene a transparente scene.setFill(Color.TRANSPARENT); Best Answer Ruslan López 2020-12-16T15:04:57+08:002020-12-16T15:04:57+08:00 很抱歉,我很长时间没有使用 JavaFX,因此我进行了更彻底的调查。 简短的回答: 您可以从方法中获取用于背景的颜色,该方法getBackground本身有一个内部使用的颜色列表,除非您使用渐变或类似的东西,否则第一个填充应该是对象的唯一背景颜色。 Color color = (Color) boton.getBackground().getFills().get(0).getFill(); System.out.println("color:"+color); 长答案: 区分以编程方式设置的颜色和从javafx-css样式设置的颜色很重要,因为这些样式比普通背景颜色具有更高的偏好,并且可能会产生细微的错误,这可能会或可能不会起作用对我们有利,我总是建议使用编程颜色而不是 javafx css 样式。 让我们看一个简单的例子,如果你有一个带有如下按钮的 fxml: <Button fx:id="btnrojillo" layoutX="16.0" layoutY="128.0" mnemonicParsing="false" onAction="#handleSubmitButtonAction" style="-fx-background-color: blue;" text="Button" /> 在你的按钮句柄中,你会写出类似的诗: @FXML protected void handleSubmitButtonAction(ActionEvent event) { String style = btnrojillo.getStyle(); System.out.println(style); btnrojillo.setStyle("-fx-background-color: red;"); String colorDesdeEstilo = style.replaceAll(".*(-fx-background-color:\\s?([a-zA-Z0-9]+)).*", "$2"); System.out.println("color detectado desde hoja de estilos:" + colorDesdeEstilo ); Color color = (Color) btnrojillo.getBackground().getFills().get(0).getFill(); System.out.println("color detectado desde configuración de componente:" + color.toString().substring(2)); } 第一次运行它时,你会得到一个非常可怕的 NPE(不是你认为的淘气;)),如下所示: 引起:java.lang.NullPointerException 在 swinginterop.Model.handleSubmitButtonAction 现在,如果我们向fxml添加颜色选择器 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.ColorPicker?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="400.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="swinginterop.Model"> <children> <AnchorPane layoutX="36.0" layoutY="47.0" prefHeight="266.0" prefWidth="258.0"> <children> <ColorPicker fx:id="colorchooser" layoutX="11.0" layoutY="40.0" onAction="#handleColorSelectedAction" /> <Button fx:id="btnrojillo" layoutX="16.0" layoutY="128.0" mnemonicParsing="false" onAction="#handleSubmitButtonAction" style="-fx-background-color: blue;" text="Button" /> </children></AnchorPane> </children> </AnchorPane> 在我们的 Java 代码中 @FXML protected void handleSubmitButtonAction(ActionEvent event) { String style = btnrojillo.getStyle(); System.out.println(style); String colorDesdeEstilo = style.replaceAll(".*(-fx-background-color:\\s?([a-zA-Z0-9]+)).*", "$2"); System.out.println("color detectado desde hoja de estilos:" + colorDesdeEstilo ); Color color = (Color) btnrojillo.getBackground().getFills().get(0).getFill(); System.out.println("color detectado desde configuración de componente:" + color.toString().substring(2)); } @FXML protected void handleColorSelectedAction(ActionEvent event) { String value = colorchooser.getValue().toString().substring(2); btnrojillo.setBackground(new Background(new BackgroundFill( colorchooser.getValue(), null, null ) ) ); } 我们会注意到颜色只是暂时改变并返回到样式中定义的颜色。 这就是为什么我建议如果您需要修改颜色,直接在样式属性中进行。 FXML: <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.ColorPicker?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="400.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="swinginterop.Model"> <children> <AnchorPane layoutX="36.0" layoutY="47.0" prefHeight="266.0" prefWidth="258.0"> <children> <ColorPicker fx:id="colorchooser" layoutX="11.0" layoutY="40.0" onAction="#handleColorSelectedAction" /> <Button fx:id="btnrojillo" layoutX="16.0" layoutY="128.0" mnemonicParsing="false" onAction="#handleSubmitButtonAction" style="-fx-background-color: blue;" text="Button" /> </children></AnchorPane> </children> </AnchorPane> 爪哇: package swinginterop; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ColorPicker; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.stage.Stage; public class Model extends Application { @FXML private Button btnrojillo; @FXML ColorPicker colorchooser; @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FórmulasGrasa.fxml")); Scene scene = new Scene(root, 300, 275); stage.setTitle("FXML Welcome"); stage.setScene(scene); stage.show(); } @FXML protected void handleSubmitButtonAction(ActionEvent event) { String style = btnrojillo.getStyle(); System.out.println(style); String colorDesdeEstilo = style.replaceAll(".*(-fx-background-color:\\s?([a-zA-Z0-9]+)).*", "$2"); System.out.println("color detectado desde hoja de estilos:" + colorDesdeEstilo ); Color color = (Color) btnrojillo.getBackground().getFills().get(0).getFill(); System.out.println("color detectado desde configuración de componente:" + color.toString().substring(2)); } @FXML protected void handleColorSelectedAction(ActionEvent event) { String value = colorchooser.getValue().toString().substring(2); Paint red = Paint.valueOf(value); btnrojillo.setBackground(new Background(new BackgroundFill( colorchooser.getValue(), null, null ) ) ); btnrojillo.setStyle("-fx-background-color: #"+value+';'); } public static void main(String args[]) { launch(args); } } 如果你碰巧在做彩色装订,我建议你用英文阅读这个问题。 如果您使用透明度,您可以尝试在 css 中使用以下内容: -fx-background-color: none; 或者,如果您通过将填充设置为空来直接从代码修改背景。
看看这是否是您在此链接中需要的:带有阴影边缘的窗口
需要仔细观察的部分是:
是
很抱歉,我很长时间没有使用 JavaFX,因此我进行了更彻底的调查。
简短的回答:
您可以从方法中获取用于背景的颜色,该方法
getBackground
本身有一个内部使用的颜色列表,除非您使用渐变或类似的东西,否则第一个填充应该是对象的唯一背景颜色。长答案:
区分以编程方式设置的颜色和从javafx-css样式设置的颜色很重要,因为这些样式比普通背景颜色具有更高的偏好,并且可能会产生细微的错误,这可能会或可能不会起作用对我们有利,我总是建议使用编程颜色而不是 javafx css 样式。
让我们看一个简单的例子,如果你有一个带有如下按钮的 fxml:
在你的按钮句柄中,你会写出类似的诗:
第一次运行它时,你会得到一个非常可怕的 NPE(不是你认为的淘气;)),如下所示:
现在,如果我们向fxml添加颜色选择器
在我们的 Java 代码中
我们会注意到颜色只是暂时改变并返回到样式中定义的颜色。
这就是为什么我建议如果您需要修改颜色,直接在样式属性中进行。
FXML:
爪哇:
如果你碰巧在做彩色装订,我建议你用英文阅读这个问题。
如果您使用透明度,您可以尝试在 css 中使用以下内容:
或者,如果您通过将填充设置为空来直接从代码修改背景。