Как изменить стандартную шкалу в LineChart JAVAFX?

234
26 июня 2018, 02:30

Первый вопрос как можно вместо стандартных надписей в названиях шкалы, вставлять например фото (со сложной формулой) ? И второй вопрос: как в linechart сделать 4 цифры после запятой в шкале. А то получается вот так:

Answer 1
  1. Прямого доступа к Label api класса не предоставляет. Но с ним можно работать через css (См. Axis). Стоит учитывать, что для корректного отображения положения Label необходимо указать какой либо не пустой текст.
  2. См. setTickLabelFormatter

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');
}
Answer 2

В дополнение к тому, что указал Александр Савостьянов, с помощью 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);
    }
}

Результат:

READ ALSO
Странности работы chararray [дубликат]

Странности работы chararray [дубликат]

На данный вопрос уже ответили:

223
Отключить функцию exec() в java 8

Отключить функцию exec() в java 8

Как я могу отключить RuntimegetRuntime()

208
Сумма по модулю 2 - всевозможные комбинации кода

Сумма по модулю 2 - всевозможные комбинации кода

Дано n комбинаций кода длиной mКак найти сумму по модулю 2 всевозможных комбинаций из n кодов

190
Можно ли использовать Contact form 7 на wordpress на локальном сервере?

Можно ли использовать Contact form 7 на wordpress на локальном сервере?

Если да, то можете пожалуйста объяснить, как этот плагин установить на openserverУ меня он выдает ошибку: Использован некорректный синтаксис...

237