Nano Hash - криптовалюты, майнинг, программирование

Запустить приложение два или более раз

Я хочу создать фабрику диаграмм JavaFx. В этом (как получить файл изображения из диаграммы Javafx (линейная диаграмма) без фактического рендеринга?) поток Я разместил вопрос о создании диаграммы без фактического рендеринга в окне приложения FX. Но теперь, когда я хочу реализовать решение несколько раз, я получаю исключение «Исключение в потоке «основной» java.lang.IllegalStateException: запуск приложения не должен вызываться более одного раза».

Я использую два класса. Класс StartChartsFx имеет основной поток, не связанный с FX, отсюда я создаю данные и запускаю процесс создания диаграммы. Класс ChartFactory запускает поток FX и генерирует диаграммы png.

Это класс StartChartsFx:

public class StartChartsFx {

    public static void main(String[] args) {

        // It can be run just once ChartFactory chf=new ChartFactory();
        HashMap<Number, Number> xyData=new HashMap<>();
        xyData.put(1, 23);
        xyData.put(2, 14);
        xyData.put(3, 15);
        xyData.put(4, 24);
        xyData.put(5, 34);
        xyData.put(6, 36);
        xyData.put(7, 22);
        xyData.put(8, 45);
        xyData.put(9, 43);
        xyData.put(10, 17);
        xyData.put(11, 29);
        xyData.put(12, 25);

        ChartFactory chf=new ChartFactory();
        chf.execute(xyData);
        chf.execute(xyData);
                System.out.print("Done");
    }
}

Это класс ChartFactory:

public class ChartFactory extends Application {

    @Override
    public void stop() throws Exception {
        super.stop();
        Platform.exit();
    }

    private static HashMap<Number, Number> a;

    @Override
    public void start(Stage arg0) throws Exception {
        Platform.setImplicitExit(false);
        // defining the axes
        NumberAxis xAxis = new NumberAxis();
        NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Number of Month");


        // creating the chart
        LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
        lineChart.setTitle("Stock Monitoring, 2010");
        lineChart.setAnimated(false);

        // defining a series
        XYChart.Series<Number, Number> series = new XYChart.Series<>();
        series.setName("My portfolio");

        // populating the series with data
        for(Map.Entry<Number, Number> entry:a.entrySet() )
            series.getData().add(new XYChart.Data<Number, Number>(entry.getKey(), entry.getValue()));       

        lineChart.getData().add(series);
        lineChart.setPrefSize(800, 240);

        Scene scene = new Scene(lineChart, 800, 240);
        System.out.println(System.getProperty("user.dir"));
        String element = getClass().getResource("chartStyles.css").toExternalForm();
        scene.getStylesheets().add(element);

        WritableImage wi = lineChart.snapshot(new SnapshotParameters(), new WritableImage(800, 240));
        File file = new File("CanvasImage.png");
        try {
            ImageIO.write(SwingFXUtils.fromFXImage(wi, null), "png", file);
        } catch (Exception s) {
        }

        CategoryAxis xAxis2 = new CategoryAxis();
        xAxis2.setLabel("Devices");
        NumberAxis yAxis2 = new NumberAxis();
        yAxis2.setLabel("Visits");
        BarChart<String, Number> barChart = new BarChart<>(xAxis2, yAxis2);
        barChart.setAnimated(false);

        XYChart.Series<String, Number> dataSeries1 = new XYChart.Series<>();
        dataSeries1.setName("2014");

        dataSeries1.getData().add(new XYChart.Data<String, Number>("Desktop", 178));
        dataSeries1.getData().add(new XYChart.Data<String, Number>("Phone", 65));
        dataSeries1.getData().add(new XYChart.Data<String, Number>("Tablet", 23));

        barChart.getData().add(dataSeries1);
        barChart.setPrefSize(640, 480);

        scene = new Scene(barChart, 640, 480);
        scene.getStylesheets().add(getClass().getResource("chartStyles.css").toExternalForm());
        wi = barChart.snapshot(new SnapshotParameters(), new WritableImage(640, 480));
        file = new File("Canvas2Image.png");
        try {
            ImageIO.write(SwingFXUtils.fromFXImage(wi, null), "png", file);
        } catch (Exception s) {
        }

        System.out.print("Done!");

        Platform.exit();

    }

    public void execute(HashMap<Number, Number> xyData) {
        a = xyData;
        launch();
    }

}

Я хотел бы создавать диаграммы с разными наборами данных неопределенное количество раз, но это выполняется только один раз.

22.07.2019

  • Вы должны посмотреть это. Кажется, что вы не можете запустить приложение javafx дважды. 23.07.2019
  • Ваша модель данных не должна запускать приложение JavaFX. В любом случае, почему вы хотите, чтобы ваше приложение запускалось более одного раза? Я подозреваю, что вам действительно нужно несколько стадий, а не экземпляры приложения. Посмотрите некоторые учебные пособия для начинающих по JavaFX и классам Stage и Scene. 23.07.2019
  • Никогда не записывайте пустой блок catch. По крайней мере, включите s.printStackTrace();. Вы хотите знать, не удалось ли записать изображение, не так ли? 23.07.2019
  • Мне просто нужна функциональность диаграмм JavaFX для создания диаграмм (например, JFreeChart), но мое основное приложение не является приложением с графическим интерфейсом. Генерация изображения это нормально. Проблема в том, что я могу запустить код только один раз из-за исключения javaFX. 23.07.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..