当你在JavaFX中创建一个圆形的VBox,并且VBox的背景颜色是黑色时,假设填充按钮后的圆角是白色的,我怎么能用另一种颜色填充这个区域(假设我希望它完全是透明的)。
答案 0 :(得分:1)
假设填充按钮后的圆角为白色,如何用其他颜色填充此区域
你在谈论“中风吗?”有“填充”(内部)和“中风”(轮廓,外缘,边缘等)
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/Shape.html
Shape类提供表示某种形状几何形状的对象的公共属性的定义。
这些属性包括: 要应用于形状的可填充内部的Paint(请参阅setFill)。
要应用于描边形状轮廓的绘画(请参阅setStroke)。
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/Shape.html#setStroke-javafx.scene.paint.Paint-(如果你没有点击上面的setStroke)
public final void setStroke(Paint value)
设置属性笔触的值。
物业描述: 使用指定Paint的设置定义围绕Shape轮廓绘制的笔划参数。除Line,Polyline和Path之外的所有形状的默认值均为null。这些形状的默认值是Color.BLACK。
从这里你用一个“Paint”对象填充它,它是许多不同类的基类,如“Color”
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/Color.html#TRANSPARENT
public static final Color TRANSPARENT
完全透明的颜色,ARGB值为#00000000。
所以...总结一下,你会想做。
button.setStroke(Color.TRANSPARENT);
如果这当然是你所要求的,因为很难说......;然而,似乎我提供的是你所要求的,但如果不是,我会再试一次:)。
答案 1 :(得分:1)
为了将容器的VBox背景设置为透明,则需要将包含VBox的场景的填充属性设置为TRANSPARENT COLOR,以下代码澄清:
这是vbox风格:
.vbox
{
-fx-background-color: black;
-fx-background-radius: 300%;
-fx-alignment:center;
}
如果您将上述样式应用于宽度和高度= 200的vbox,则会得到一个黑色背景的圆圈,而圆角则填充白色。要使这个白色角落透明,您需要添加以下代码:
loader.setLocation(MainApp.class.getResource("view/Test.fxml"));
VBox page = (VBox) loader.load();
Stage testStage = new Stage();
Scene scene = new Scene(page);
scene.setFill(Color.TRANSPARENT);
testStage.setScene(scene);
答案 2 :(得分:1)
我认为,提问者最终想要一轮漂浮VBox
。
这可以通过多种方式实现,而不需要考虑太多,我宁愿使用剪切Node
而不是纯CSS
方法(这也应该是可行的)。
正如他已经写过的那样,你还需要Scene
填充Color.TRANSPARENT
(也可能是Stage
)。
我的方法看起来像这样。首先是FXML
文件:
<?import java.lang.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:id="root" fx:controller="application.ClipExampleController" style="-fx-background-color: steelblue;">
<center>
<VBox fx:id="vbox" alignment="CENTER" spacing="5" maxWidth="150">
<Label text="Bla"/>
<TextField promptText="Blub"/>
<Button text="Do it"/>
</VBox>
</center>
</BorderPane>
然后是Controller类: 包裹申请;
import javafx.beans.binding.DoubleBinding;
import javafx.fxml.FXML;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
public class ClipExampleController {
@FXML
private BorderPane root;
@FXML
private VBox vbox;
@FXML
protected void initialize() {
Circle clip = new Circle();
clip.radiusProperty().bind(new DoubleBinding() {
{
bind(vbox.widthProperty());
}
@Override
protected double computeValue() {
return vbox.getWidth() / 2 + 25;
}
});
clip.centerXProperty().bind(new DoubleBinding() {
{
bind(root.widthProperty());
}
@Override
protected double computeValue() {
return root.getWidth() / 2;
}
});
clip.centerYProperty().bind(new DoubleBinding() {
{
bind(root.heightProperty());
}
@Override
protected double computeValue() {
return root.getHeight() / 2;
}
});
root.setClip(clip);
}
}
最后是胶水代码 - 主Application
:
包裹申请;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("ClipExample.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root, 300, 300);
scene.setFill(Color.TRANSPARENT);
stage.initStyle(StageStyle.TRANSPARENT);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
因此。假设我理解正确,这将是我的解决方案。