javafx圆角矩形

时间:2016-04-11 13:27:51

标签: javafx-8 rounded-corners

当你在JavaFX中创建一个圆形的VBox,并且VBox的背景颜色是黑色时,假设填充按钮后的圆角是白色的,我怎么能用另一种颜色填充这个区域(假设我希望它完全是透明的)。

3 个答案:

答案 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);
    }
}

因此。假设我理解正确,这将是我的解决方案。