2016-04-13 2 views
2

У меня есть базовое приложение, похожее на игрушечную коробку. На самом деле это не делает ничего, кроме того, что вы можете перемещать фигуры вокруг экрана, если вы дважды щелкните по форме, выводит его на передний план. Существует также меню с меню пунктами «Новая„открытым“,„Сохранить“-Сохранение фигур в файл, нарисованных на границе панели в javafx

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.SeparatorMenuItem; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.text.Font; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class RandCMove extends Application 
{ 
    public static void main(String [] args) 
    { 
     launch(args); 
    } 
    public void start(Stage primaryStage) 
    { 
     BorderPane root = new BorderPane(); 

     MenuBar menuBar = new MenuBar(); 
     menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); 


     Menu fileMenu = new Menu("File"); 
     MenuItem newMenuItem = new MenuItem("New"); 
     MenuItem openMenuItem = new MenuItem("Open"); 
     MenuItem saveMenuItem = new MenuItem("Save"); 
     MenuItem exitMenuItem = new MenuItem("Exit"); 

     fileMenu.getItems().addAll(newMenuItem,openMenuItem,saveMenuItem, 
    new SeparatorMenuItem(),exitMenuItem); 

     menuBar.getMenus().add(fileMenu); 

     Rectangle rect = new Rectangle(); 
     rect.setWidth(200); 
     rect.setHeight(200); 
     rect.setArcHeight(20); 
     rect.setArcWidth(20); 
     rect.setFill(Color.RED); 
     rect.setX(200); 
     rect.setY(100); 

     root.setTop(menuBar); 
     root.getChildren().add(rect); 

     Circle circle = new Circle(
      300,300,100); 

     Text text = new Text(150,150,"Text"); 
     Font phosphate = Font.font("Phosphate",150); 
     text.setFont(phosphate); 

     text.setTranslateY(circle.getBoundsInParent().getMinY()+10); 

     root.getChildren().add(text); 

     //Positions the circle under the rectangle 
     circle.setTranslateY(rect.getBoundsInParent().getMinY()+30); 
     root.getChildren().add(circle); 

     // Moves shapes depending on if the cursor on the particular shape 
     // Brings shape to the front using double click 
     root.setOnMouseMoved(e -> 
     { 
      if(rect.contains(e.getX(),e.getY())) 
       rect.setOnMouseDragged(f ->{ 
        rect.setX(f.getX()); 
        rect.setY(f.getY()); 
       }); 
       rect.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         rect.toFront(); 
       }); 
      if(circle.contains(e.getX(),e.getY())) 
        circle.setOnMouseDragged(f->{ 
        circle.setCenterX(f.getX()); 
        circle.setCenterY(f.getY());  
       }); 
       circle.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         circle.toFront(); 
       }); 
      if(text.contains(e.getX(),e.getY())) 
       text.setOnMouseDragged(f ->{ 
        text.setX(f.getX()); 
        text.setY(f.getY()); 
        }); 
       text.setOnMouseClicked(f ->{ 
        if(f.getClickCount() >= 2) 
         text.toFront(); 
       }); 

     }); 

     Scene scene = new Scene(root,600,600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

Я хочу, чтобы иметь возможность сохранить текущее состояние фигур на экране, и у них нагрузки, как они были при нажатии «Открыть».

Я не могу найти что-нибудь полезное на этом, может кто-нибудь дать некоторые ориентиры или мне точку в правильном направлении? Любая помощь будет оценена по достоинству!

ответ

2

приложений требуют предпочтений и настроек данных для адаптации к потребностям разных пользователей и сред. Пакет java.util.prefs предоставляет возможность приложениям хранить и извлекать пользовательские и системные данные данных и данных конфигурации. Данные хранятся постоянно в хранилище поддержки, зависящем от реализации. Существует два отдельных дерева предпочтительных узлов: один для пользовательских настроек и один для системных настроек.

Больше на:

http://docs.oracle.com/javase/8/docs/technotes/guides/preferences/

0

Это является нетривиальной задачей. Я не собираюсь предоставить код для него здесь, но только в общих чертах подход:

  1. сериализовать фигуры FXML (вам нужно будет кодировать сериализатором себя).
  2. Каждый раз, когда пользователь редактирует фигуры, снова сериализуйте на FXML и сохраните FXML как preference (как указано в ответе Фрэнка Фотанга).
  3. Когда пользователь сначала открывает приложение, прочитайте текущую настройку, содержащую FXML для текущих фигур, и загрузите их с помощью FXMLLoader.

Тот же метод может быть использован для реализации ваших открытия и сохранения параметров меню, только вместо того, чтобы писать сериализованные данные предпочтения вы напишете его в местоположение файла, выбранного в FileChooser.

Я бы предпочел сделать это скорее как FX, а не Fxml.

Я думаю, вы неправильно поняли проблему, которую вам нужно решить. Для этого нет «способа FX».

Ваша проблема заключается в том, что вам необходимо сериализовать и десериализовать узлы из графика сцены, для которых основной API JavaFX не обеспечивает полную реализацию.

Когда вы создаете граф сцены с использованием JavaFX с использованием API JavaFX, это представление вашей сцены в памяти, доступное только во время выполнения вашей программы. То, что вам нужно, это сохранить эту сцену в файле, чтобы при закрытии приложения данные, представляющие сцену, были где-то сохранены. Затем вам нужно прочитать данные из файла и воссоздать сцену в памяти, когда пользователь снова запустит приложение. Единственный способ сделать это - сериализовать объекты в хранилище, когда это необходимо, и десериализовать объекты из хранилища, когда приложение снова начнет резервное копирование. Прочтите статью в Википедии по адресу serialization, чтобы понять концептуальный процесс.

Теперь вам не нужно использовать FXML для вашего последовательного формата, вы можете использовать другие форматы, такие как JSON или YAML, и другие библиотеки поддержки сериализации, такие как Jackson. Однако для меня FXML представляется наиболее логичным форматом, потому что JavaFX поставляется с FXMLLoader, который предоставляет простой в использовании API для переноса ваших сериализованных данных (файл FXML, представляющего вашу сцену) в структуру памяти (граф сцены), путем простого вызова load method.

Что делает эту задачу сложной, а не тривиальной, заключается в том, что API JavaFX поставляется только с FXMLLoader, он не поставляется с соответствующим классом (например, FXMLSaver), что делает противоположную работу по созданию структуры в памяти (график сцены) и создание сериализованных данных из него (файл FXML). Поэтому вам нужно будет написать такую ​​логику самостоятельно.

Теперь SceneBuilder является проектом с открытым исходным кодом и включает логику для сохранения графика сцены в файл FXML. Например, вы можете find source code for an FXMLSaver в источнике SceneBuilder. Возможно, вы можете использовать или адаптировать этот код для сохранения объектов графика сцены в сериализованном формате. При этом вы не будете использовать приложение компоновщика сцен для создания и сохранения своей сцены, вместо этого вы будете адаптировать исходный код SceneBuilder, который будет включен в ваше собственное приложение, которое будет создавать и сохранять вашу сцену.

+0

Я бы предпочел сделать это скорее как FX, а не Fxml. Возможно ли с тем же подходом? – Treeno1

+0

Я не понимаю, что вы имеете в виду. Что такое «способ FX»? – jewelsea

+0

Я думаю, лучший способ для меня объяснить это - http://www.javafxtutorials.com/tutorials/switching-to-different-screens-in-javafx-and-fxml/. по сути, демонстрацию о переключении кадров с использованием двух подходов, с использованием FXML с использованием построителя сцен или просто кодирования javaFX. Как только я услышал FXML, я предположил, что вы имели в виду использование построителя сцен, так как это действительно был мой единственный опыт работы с FXML. к сожалению, я не очень хорош. Так похоже на этот пример. Есть ли способ, которым я могу просто его кодировать без использования FXML, это то, что я хотел сказать? – Treeno1

Смежные вопросы