У меня есть это окно:
@Override
public void start(Stage primaryStage){
NumberAxis xAxis = new NumberAxis(1960, 2020, 10);
xAxis.setLabel("Years");
NumberAxis yAxis = new NumberAxis(0, 350, 50);
yAxis.setLabel("No.of schools");
LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Chart");
XYChart.Series<Number, Number> series = new XYChart.Series<>();
series.setName("No of schools in an year");
Platform.runLater(() ->
series.getNode().lookup(".chart-series-line").setStyle("-fx-stroke: black;")
);
series.getData().add(new XYChart.Data<>(1970, 15));
series.getData().add(new XYChart.Data<>(1980, 30));
series.getData().add(new XYChart.Data<>(1990, 60));
series.getData().add(new XYChart.Data<>(2000, 120));
series.getData().add(new XYChart.Data<>(2013, 240));
series.getData().add(new XYChart.Data<>(2014, 300));
lineChart.getData().add(series);
var scene = new Scene(lineChart);
primaryStage.setScene(scene);
primaryStage.show();
}
Вот как это выглядит:
Я хочу изменить цвет серии, но я могу изменить цвет линии, но не форму.
Как я могу изменить цвет формы?
Я обновил свой ответ.
Как насчет CSS? Это список css, которые можно использовать с линейной диаграммой. Вы можете комбинировать lookup
, setStyle
и свойство css для динамического изменения стиля.
.chart {
-fx-padding: 10px;
-fx-background-image: url("icon.png");
}
.chart-content {
-fx-padding: 30px;
}
.chart-title {
-fx-text-fill: #4682b4;
-fx-font-size: 1.6em;
}
.axis-label {
-fx-text-fill: #4682b4;
}
.chart-legend {
-fx-background-color: transparent;
-fx-padding: 20px;
}
.chart-legend-item-symbol{
-fx-background-radius: 0;
}
.chart-legend-item{
-fx-text-fill: #191970;
}
.chart-plot-background {
-fx-background-color: #e2ecfe;
}
.chart-vertical-grid-lines {
-fx-stroke: #3278fa;
}
.chart-horizontal-grid-lines {
-fx-stroke: #3278fa;
}
.chart-alternative-row-fill {
-fx-fill: #99bcfd;
-fx-stroke: transparent;
-fx-stroke-width: 0;
}
Подробнее о https://docs.oracle.com/javafx/2/charts/css-styles.htm
Я хочу использовать setStyle для установки динамического цвета.
Я бы предложил использовать CSS
. Ключевым моментом здесь является поиск всех узлов, связанных с серией, и изменение цвета узлов. Первая серия .series0
.
Key Code:
Set<Node> nodes = lineChart.lookupAll(".series" + 0);
for (Node n : nodes) {
n.setStyle("-fx-background-color: black, white;\n"
+ " -fx-background-insets: 0, 2;\n"
+ " -fx-background-radius: 5px;\n"
+ " -fx-padding: 5px;");
}
Full Code
import java.util.Set;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class ScatterChartSample extends Application {
@Override
public void start(Stage stage) {
NumberAxis xAxis = new NumberAxis(1960, 2020, 10);
xAxis.setLabel("Years");
NumberAxis yAxis = new NumberAxis(0, 350, 50);
yAxis.setLabel("No.of schools");
LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Chart");
XYChart.Series<Number, Number> series = new XYChart.Series<>();
series.setName("No of schools in an year");
Platform.runLater(()
-> {
Set<Node> nodes = lineChart.lookupAll(".series" + 0);
for (Node n : nodes) {
n.setStyle("-fx-background-color: black, white;\n"
+ " -fx-background-insets: 0, 2;\n"
+ " -fx-background-radius: 5px;\n"
+ " -fx-padding: 5px;");
}
series.getNode().lookup(".chart-series-line").setStyle("-fx-stroke: black;");
});
series.getData().add(new XYChart.Data<>(1970, 15));
series.getData().add(new XYChart.Data<>(1980, 30));
series.getData().add(new XYChart.Data<>(1990, 60));
series.getData().add(new XYChart.Data<>(2000, 120));
series.getData().add(new XYChart.Data<>(2013, 240));
series.getData().add(new XYChart.Data<>(2014, 300));
lineChart.getData().add(series);
var scene = new Scene(lineChart);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Update: Try this!
for (Data<Number, Number> entry : series.getData()) {
entry.getNode().setStyle("-fx-background-color: black, white;\n"
+ " -fx-background-insets: 0, 2;\n"
+ " -fx-background-radius: 5px;\n"
+ " -fx-padding: 5px;");
}
Я хочу установить динамический цвет через setStyle. Есть способ установить через серию?
Я добавил обновление @KunLun. Я думаю, что обновление отвечает на ваш вопрос.