2016-10-15 5 views
-1

Я работаю над проектом, который, имеющий два FXML файлы, я сумел открыть оба FXML файлы из MainController в обоих направлениях, какКак поместить файл fxml в ChildAnchorPane?

Оба действия, выполняемые при нажатии на кнопки

  1. создание и открытие новой сцены, сцены и загрузки файла fxml.
  2. заменяющий дочерний элемент AnchorPane с помощью fxml.

Проблема во втором способе: файл fxml не поместится в соответствии с дочерней анкерной панелью, которую я уже определил в своем основном файле FXML с координатами, появляется в левом верхнем углу основного экрана и есть каким-либо образом я могу исправить эту проблему?

Пожалуйста, следуйте снимку экрана, который объясняет графическое представление моего приложения. enter image description here

MainController.java

@FXML 
private Button okay; 
@FXML 
private AnchorPane HostScreen,MainScreen; 
class NewStage{ 
    NewStage() throws IOException{ 
     Stage subStage = new Stage(); 
     subStage.setTitle("Connect To MySQL Host"); 
     HostScreen = (AnchorPane)FXMLLoader.load(getClass().getResource("SQLHostWindow.fxml")); 
     Scene HostScene = new Scene(HostScreen,640,400); 
     subStage.setScene(HostScene); 
     subStage.centerOnScreen(); 
     subStage.show(); 
    } 
} 
class NewScene{ 
    NewScene() throws IOException{ 
     HostScreen = (AnchorPane)FXMLLoader.load(getClass().getResource("SQLHostWindow.fxml")); 
     MainScreen.getChildren().set(0, HostScreen); 
     System.out.println(MainScreen.getChildren().get(0)); 
    } 
} 

@FXML 
public void OpenHostScreen(ActionEvent event) throws IOException{ 

    new NewStage(); 
    new NewScene(); 

} 

ответ

3

Прежде всего, это нонсенс, чтобы использовать конструкторы внутренних классов, чтобы изменить сцену, если эти классы не имеют какой-либо другой функции. В этом случае вы просто создаете объекты без какой-либо реальной причины. Вместо этого функциональность должна быть перемещена в методы, например.

Кроме того, вы не можете ожидать, что параметры макета исходного узла просто быть переданы в узел замены только потому, что вы замените узел. Pane s часто хранит свойства макета внутри карты дочернего узла properties. Содержимое этой карты не копируется автоматически.

Также есть некоторые свойства ребенка Node, которые могут иметь отношение к родителю в зависимости от его типа и параметры, хранящиеся в properties:

  • layoutX, layoutY (в случае, если они не определены родитель)
  • managed
  • Translate, Rotate, Scale
  • размер
  • ...

В этом случае вы, скорее всего, нужно всего лишь скопировать якоря, размер и положение, которое может быть сделано путем копирования свойств и назначения layoutX, layoutY, prefWidth и prefHeight.

Пример

@Override 
public void start(Stage primaryStage) { 
    Region back = new Region(); 
    back.relocate(10, 10); 
    back.setPrefSize(590, 390); 
    back.setStyle("-fx-background-color: blue;"); 

    AnchorPane.setBottomAnchor(back, 10d); 
    // AnchorPane.setTopAnchor(back, 10d); 
    AnchorPane.setLeftAnchor(back, 10d); 
    AnchorPane.setRightAnchor(back, 10d); 

    Button btn = new Button("Change"); 

    AnchorPane root = new AnchorPane(back, btn); 

    btn.setOnAction((ActionEvent event) -> { 
     // replace first child of root with new one; keep anchors & position/size 
     Region region = new Region(); 
     region.setStyle("-fx-background-color: red;"); 
     Node oldRegion = root.getChildren().set(0, region); 

     // copy properties from old map 
     Map<Object, Object> properties = region.getProperties(); 
     oldRegion.getProperties().forEach((k, v) -> properties.putIfAbsent(k, v)); 

     // copy position & set pref size to size of replaced node 
     region.relocate(oldRegion.getLayoutX(), oldRegion.getLayoutX()); 
     Bounds bounds = oldRegion.getLayoutBounds(); 
     region.setPrefSize(bounds.getWidth(), bounds.getHeight()); 
    }); 

    Scene scene = new Scene(root, 600, 400); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

  • Нет связанных вопросов^_^