Первый вопрос как можно вместо стандартных надписей в названиях шкалы, вставлять например фото (со сложной формулой) ? И второй вопрос: как в linechart сделать 4 цифры после запятой в шкале. А то получается вот так:
Label
api
класса не предоставляет. Но с ним
можно работать через css
(См. Axis). Стоит учитывать, что для корректного отображения положения Label
необходимо указать какой либо не пустой текст.Main.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class Main extends Application {
public void start(Stage primaryStage) {
FourDecimalPlacesStringConverter fourDecimalPlacesStringConverter = new FourDecimalPlacesStringConverter();
NumberAxis xAxis = new NumberAxis(0, 0.1, 0.002);
xAxis.setTickLabelFormatter(fourDecimalPlacesStringConverter);
xAxis.getStyleClass().add("batman-axis");
xAxis.setLabel("X");
NumberAxis yAxis = new NumberAxis(0, 0.1, 0.002);
yAxis.setTickLabelFormatter(fourDecimalPlacesStringConverter);
yAxis.setLabel(" ");
LineChart lineChart = new LineChart(xAxis, yAxis);
Scene scene = new Scene(lineChart);
scene.getStylesheets().add("Main.css");
primaryStage.setScene(scene);
primaryStage.show();
}
static class FourDecimalPlacesStringConverter extends StringConverter<Number> {
public String toString(Number number) { return String.format("%.4f", number); }
public Number fromString(String string) { return null; }
}
}
Main.css
.axis .axis-label {
-fx-graphic: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2V7LfMGe7Isgp-n2v3z4EUx8yD3v0qDHRzyVczkwYSGD6u2Zjpg');
}
.batman-axis .axis-label {
-fx-graphic: url('https://cdn4.iconfinder.com/data/icons/mask/512/shield-death-batman-comics-bad-hero-48.png');
}
В дополнение к тому, что указал Александр Савостьянов, с помощью css можно заменить скин метки:
main.css
:
.axis .axis-label {
-fx-skin: 'sample.JLatexMathLabelSkin';
}
.batman-axis .axis-label {
-fx-skin: 'sample.JLatexMathLabelSkin';
-fx-font-size: 24;
-fx-text-fill: darkgreen;
-fx-background-color: lightgoldenrodyellow ;
}
Воспользовавшись jlatexmath 1.0.6, у меня полчился такой скин (Java 8):
package sample;
import com.sun.javafx.scene.control.skin.LabelSkin;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import org.scilab.forge.jlatexmath.TeXConstants;
import org.scilab.forge.jlatexmath.TeXFormula;
import java.awt.image.BufferedImage;
import java.util.List;
public class JLatexMathLabelSkin extends LabelSkin {
public JLatexMathLabelSkin(Label label) {
super(label);
label.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
applyFormula(label.getText(), label);
label.textProperty().addListener((observable, oldValue, newValue)
-> applyFormula(newValue, label));
label.fontProperty().addListener((observable, oldValue, newValue)
-> applyFormula(label.getText(), label));
label.textFillProperty().addListener((observable, oldValue, newValue)
-> applyFormula(label.getText(), label));
label.backgroundProperty().addListener((observable, oldValue, newValue)
-> applyFormula(label.getText(), label));
}
private static void applyFormula(String formula, Label label) {
TeXFormula tex = new TeXFormula(formula);
java.awt.Image awtImage = tex.createBufferedImage(TeXConstants.STYLE_TEXT,
(float) label.getFont().getSize(),
fxPaint2awtColor(label.getTextFill(), java.awt.Color.BLACK),
fxPaint2awtColor(firstBackgroundPaint(label), null));
Image fxImage = SwingFXUtils.toFXImage((BufferedImage) awtImage, null);
ImageView imageView = new ImageView(fxImage);
label.setGraphic(imageView);
}
private static java.awt.Color fxColor2awtColor(javafx.scene.paint.Color colorFx) {
return new java.awt.Color(
(float) colorFx.getRed(),
(float) colorFx.getGreen(),
(float) colorFx.getBlue(),
(float) colorFx.getOpacity());
}
private static java.awt.Color fxPaint2awtColor(javafx.scene.paint.Paint paint,java.awt.Color orDefault) {
if (paint instanceof Color)
return fxColor2awtColor((Color) paint);
return orDefault;
}
private static Paint firstBackgroundPaint(Label l) {
Background bg = l.getBackground();
if (bg == null) return null;
List<BackgroundFill> fills = bg.getFills();
if (fills == null || fills.size() == 0) return null;
BackgroundFill f = fills.get(0);
if (f == null) return null;
return f.getFill();
}
}
Main.java
- практически такой же, как и у Александра:
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FourDecimalPlacesStringConverter fourDecimalPlacesStringConverter = new FourDecimalPlacesStringConverter();
NumberAxis xAxis = new NumberAxis(0, 0.1, 0.002);
xAxis.setTickLabelFormatter(fourDecimalPlacesStringConverter);
xAxis.getStyleClass().add("batman-axis");
xAxis.setLabel("\\mu(\\tau) + a \\cdot b");
NumberAxis yAxis = new NumberAxis(0, 0.1, 0.002);
yAxis.setTickLabelFormatter(fourDecimalPlacesStringConverter);
yAxis.setLabel("\\sqrt{a \\cdot b + \\mu(\\tau)}");
LineChart lineChart = new LineChart<>(xAxis, yAxis);
Scene scene = new Scene(lineChart);
scene.getStylesheets().add("main.css");
primaryStage.setScene(scene);
primaryStage.show();
}
static class FourDecimalPlacesStringConverter extends StringConverter<Number> {
public String toString(Number number) { return String.format("%.4f", number); }
public Number fromString(String string) { return null; }
}
public static void main(String[] args) {
launch(args);
}
}
Результат:
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Дано n комбинаций кода длиной mКак найти сумму по модулю 2 всевозможных комбинаций из n кодов
Если да, то можете пожалуйста объяснить, как этот плагин установить на openserverУ меня он выдает ошибку: Использован некорректный синтаксис...