Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx线性梯度重复行为_Javafx_Javafx 8 - Fatal编程技术网

Javafx线性梯度重复行为

Javafx线性梯度重复行为,javafx,javafx-8,Javafx,Javafx 8,Javafx线性渐变重复似乎反映了颜色,而不是重复 我编写了一个简单的应用程序,以显示在自定义节点(StackPane)上的应用程序中使用带重复的线性渐变创建条带模式时所看到的情况。在我的应用程序中,这是作为叠加添加到XYChart的,它们的高度各不相同。使用矩形效果不佳,这就是为什么我使用Stackpane并在其上设置样式,而不是以编程方式创建LinearGradient。 颜色列表是动态的,在应用程序中大小不一。 问题在于线性渐变如何翻转列表,并在每次重复时反映颜色,而不仅仅是重复 这个链接

Javafx线性渐变重复似乎反映了颜色,而不是重复

我编写了一个简单的应用程序,以显示在自定义节点(StackPane)上的应用程序中使用带重复的线性渐变创建条带模式时所看到的情况。在我的应用程序中,这是作为叠加添加到XYChart的,它们的高度各不相同。使用矩形效果不佳,这就是为什么我使用Stackpane并在其上设置样式,而不是以编程方式创建LinearGradient。 颜色列表是动态的,在应用程序中大小不一。 问题在于线性渐变如何翻转列表,并在每次重复时反映颜色,而不仅仅是重复

这个链接描述了一个类似的问题,但只是添加了无休止的停止,就像我的问题的一个混乱的解决方案一样,最好添加一次颜色并重复

java.util.List;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
试一试{
BorderPane根=新的BorderPane();
List colors=Arrays.asList(Color.RED,Color.BLUE,Color.YELLOW,Color.GREEN);
StackPane StackPane=新的StackPane();
stackPane.setStyle(getLinearGradientStyle(颜色));
root.setCenter(stackPane);
场景=新场景(根,400400);
初级阶段。场景(场景);
primaryStage.show();
}
捕获(例外e){
e、 printStackTrace();
}
}
私有字符串getLinearGradientStyle(列表颜色){
StringBuilder StringBuilder=new StringBuilder(“-fx背景色:线性渐变(从0px 0px到10px 10px,重复)”);
对于(int i=0;i
下面是一个使用重复线性渐变的CSS3示例:

向下滚动到以下文本:将创建条带背景,其中每个线性渐变是三条带渐变,无限重复(这是示例)

我的示例使用了我需要的对角线模式,但上面的示例显示了我希望看到的在普通css中没有反射的纯色重复颜色


感谢您的帮助

这看起来像一个bug。如果您运行以下示例(将CSS移动到一个文件中):

Main.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Region region = new Region();
        region.backgroundProperty().addListener((obs, ov, nv) ->
                System.out.println(nv.getFills().get(0).getFill()));

        Scene scene = new Scene(region, 500, 300);
        scene.getStylesheets().add("Main.css");

        primaryStage.setScene(scene);
        primaryStage.show();
    }

}
Main.css

.root{
-fx背景色:线性渐变(从0px 0px到10px 10px,重复,红色20%,蓝色40%,黄色60%,绿色80%);
}
您将看到打印出以下内容:

线性梯度(从0.0px 0.0px到10.0px 10.0px,反射,0xff0000ff 0.0%,0xff0000ff 20.0%,0x0000ffff 40.0%,0xFF00FF 60.0%,0x008000ff 80.0%,0x008000ff 100.0%)
如您所见,尽管在CSS中使用了“repeat”,但创建的
LinearGradient
使用了“reflect”

对于这个bug,您自己可能无能为力,但是如果您不介意在代码(甚至可能是FXML)中设置背景,那么下面应该做您想做的事情:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        LinearGradient gradient = new LinearGradient(0, 0, 10, 10, false, CycleMethod.REPEAT,
                new Stop(0.2, Color.RED),
                new Stop(0.4, Color.BLUE),
                new Stop(0.6, Color.YELLOW),
                new Stop(0.8, Color.GREEN)
        );

        Region region = new Region();
        region.setBackground(new Background(new BackgroundFill(gradient, null, null)));

        Scene scene = new Scene(region, 500, 300);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

}
您可以将
LinearGradient
的创建移动到采用任意数量的
颜色的方法中,就像您当前所做的那样


如果您感兴趣,我相信bug位于
javafx.css.CssParser
第1872行附近(在javafx 12中):

如您所见,当文本等于
“repeat
”时,它错误地将
循环方法设置为
REFLECT


已提交错误报告:(GitHub).Fix version:openjfx13。

嘿,太好了,谢谢你指出这个错误。我已经实现了你建议的一个版本,效果很好:)非常感谢,似乎这个错误至少在Java 8之后就出现了。不过,这对它会有好处,所以它可以被确认和修复。@JoséPereda,正如我在回答的最后提到的,我我已经提交了一个bug报告,只是还没有得到反馈。虽然我已经提交给JBS,但我是否也应该在GitHub上提出这个问题?理想情况下,一旦JBS问题得到批准,你应该在GitHub上提交bug,并附上问题id。如果出于任何原因你没有得到反馈,那么就继续提交给GitHub并提及它。@JoséPereda完成了。添加了答案末尾的链接。。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        LinearGradient gradient = new LinearGradient(0, 0, 10, 10, false, CycleMethod.REPEAT,
                new Stop(0.2, Color.RED),
                new Stop(0.4, Color.BLUE),
                new Stop(0.6, Color.YELLOW),
                new Stop(0.8, Color.GREEN)
        );

        Region region = new Region();
        region.setBackground(new Background(new BackgroundFill(gradient, null, null)));

        Scene scene = new Scene(region, 500, 300);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

}
CycleMethod cycleMethod = CycleMethod.NO_CYCLE;
if ("reflect".equalsIgnoreCase(arg.token.getText())) {
    cycleMethod = CycleMethod.REFLECT;
    prev = arg;
    arg = arg.nextArg;
} else if ("repeat".equalsIgnoreCase(arg.token.getText())) {
    cycleMethod = CycleMethod.REFLECT;
    prev = arg;
    arg = arg.nextArg;
}