如何在 Javafx 中设置条形图的颜色
How set color of BarChart in Javafx
我有一个应用程序可以读取文件并显示文件中每个字母出现次数的图表(在我的应用程序中,文件必须位于 "C:/new1.txt")。
我想根据所选的单选按钮设置栏的颜色,但它不会改变 colour.How 我可以设置颜色吗?我在哪里会出错?
控制器Class:
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Controller {
@FXML
public BarChart<String,Number> barchart;
@FXML
RadioButton redbutton=new RadioButton("Red");
@FXML
RadioButton bluebutton=new RadioButton("Blue");
@FXML
ToggleGroup group=new ToggleGroup();
public void selam(ActionEvent a){
//Array to store number of occurrences of each letter in file
//Ex = if exist 2 "a" and 4 "d" then counter[0]=2 and counter[3]=4
int[] counter = new int[26];
//Read file
try {
File file = new File("C:/new1.txt");
Scanner scanner = new Scanner(file,"utf-8");
while (scanner.hasNext()) {
char[] chars = scanner.nextLine().toLowerCase().toCharArray();
for (Character karakter : chars) {
if(Character.isLetter(karakter)) {
//add to array
counter[karakter - 'a']++;
}
}
}
} catch (FileNotFoundException e) {
System.out.println("File does not exist");
}
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
int orderofletter=0;
XYChart.Series series1 = new XYChart.Series();
//Add number of occurrences of each letter to XY chart
for (char c:alphabet){
series1.getData().add(new XYChart.Data(String.valueOf(c), counter[orderofletter]));
orderofletter++;
}
// CHANGE COLOR
if(redbutton.isSelected()){
barchart.setStyle("-fx-bar-fill: red;");
System.out.println("Red");
}
if(bluebutton.isSelected()){
barchart.setStyle("-fx-bar-fill: blue;");
}
//Add xychart to barchart
barchart.getData().addAll(series1);
}
}
FXML class:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<Pane id="mainpane" fx:id="mainpane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="590.0" prefWidth="1085.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<TextField layoutY="517.0" prefHeight="67.0" prefWidth="309.0" />
<BarChart fx:id="barchart" barGap="2.0" layoutY="8.0" prefHeight="498.0" prefWidth="1085.0" style="-fx-border-color: chartreuse;">
<xAxis>
<CategoryAxis endMargin="0.0" side="BOTTOM" startMargin="0.0" />
</xAxis>
<yAxis>
<NumberAxis prefHeight="364.0" prefWidth="33.0" side="LEFT" upperBound="0.0" />
</yAxis>
</BarChart>
<Button layoutX="447.0" layoutY="512.0" mnemonicParsing="false" onAction="#selam" prefHeight="67.0" prefWidth="139.0" text="Draw" />
<RadioButton fx:id="bluebutton" layoutX="324.0" layoutY="551.0" mnemonicParsing="false" text="Blue">
<toggleGroup>
<ToggleGroup fx:id="group" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="redbutton" layoutX="324.0" layoutY="517.0" mnemonicParsing="false" text="Red" toggleGroup="$group" />
</children>
</Pane>
我认为您需要为每个图表栏单独设置颜色:
barchart.getData().addAll(series1);
if (bluebutton.isSelected()) {
barchart.lookupAll(".default-color0.chart-bar")
.forEach(n -> n.setStyle("-fx-bar-fill: blue;"));
}
我有一个应用程序可以读取文件并显示文件中每个字母出现次数的图表(在我的应用程序中,文件必须位于 "C:/new1.txt")。
我想根据所选的单选按钮设置栏的颜色,但它不会改变 colour.How 我可以设置颜色吗?我在哪里会出错?
控制器Class:
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Controller {
@FXML
public BarChart<String,Number> barchart;
@FXML
RadioButton redbutton=new RadioButton("Red");
@FXML
RadioButton bluebutton=new RadioButton("Blue");
@FXML
ToggleGroup group=new ToggleGroup();
public void selam(ActionEvent a){
//Array to store number of occurrences of each letter in file
//Ex = if exist 2 "a" and 4 "d" then counter[0]=2 and counter[3]=4
int[] counter = new int[26];
//Read file
try {
File file = new File("C:/new1.txt");
Scanner scanner = new Scanner(file,"utf-8");
while (scanner.hasNext()) {
char[] chars = scanner.nextLine().toLowerCase().toCharArray();
for (Character karakter : chars) {
if(Character.isLetter(karakter)) {
//add to array
counter[karakter - 'a']++;
}
}
}
} catch (FileNotFoundException e) {
System.out.println("File does not exist");
}
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
int orderofletter=0;
XYChart.Series series1 = new XYChart.Series();
//Add number of occurrences of each letter to XY chart
for (char c:alphabet){
series1.getData().add(new XYChart.Data(String.valueOf(c), counter[orderofletter]));
orderofletter++;
}
// CHANGE COLOR
if(redbutton.isSelected()){
barchart.setStyle("-fx-bar-fill: red;");
System.out.println("Red");
}
if(bluebutton.isSelected()){
barchart.setStyle("-fx-bar-fill: blue;");
}
//Add xychart to barchart
barchart.getData().addAll(series1);
}
}
FXML class:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<Pane id="mainpane" fx:id="mainpane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="590.0" prefWidth="1085.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<TextField layoutY="517.0" prefHeight="67.0" prefWidth="309.0" />
<BarChart fx:id="barchart" barGap="2.0" layoutY="8.0" prefHeight="498.0" prefWidth="1085.0" style="-fx-border-color: chartreuse;">
<xAxis>
<CategoryAxis endMargin="0.0" side="BOTTOM" startMargin="0.0" />
</xAxis>
<yAxis>
<NumberAxis prefHeight="364.0" prefWidth="33.0" side="LEFT" upperBound="0.0" />
</yAxis>
</BarChart>
<Button layoutX="447.0" layoutY="512.0" mnemonicParsing="false" onAction="#selam" prefHeight="67.0" prefWidth="139.0" text="Draw" />
<RadioButton fx:id="bluebutton" layoutX="324.0" layoutY="551.0" mnemonicParsing="false" text="Blue">
<toggleGroup>
<ToggleGroup fx:id="group" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="redbutton" layoutX="324.0" layoutY="517.0" mnemonicParsing="false" text="Red" toggleGroup="$group" />
</children>
</Pane>
我认为您需要为每个图表栏单独设置颜色:
barchart.getData().addAll(series1);
if (bluebutton.isSelected()) {
barchart.lookupAll(".default-color0.chart-bar")
.forEach(n -> n.setStyle("-fx-bar-fill: blue;"));
}