2014-11-29 2 views
-1

Я просто столкнулся с проблемой, чтобы реализовать полную модель MVC с JavaFX. Я создал легкую структуру в файле fxml с разделенной панелью.Вызов файлов FXML из файла контроллера

Идея состоит в том, чтобы с левой стороны было меню дерева и элементы GUI с левой стороны, чтобы настроить параметры моего графического интерфейса. Чтобы заполнить правую часть, я хотел загрузить соответствующие файлы fxml на панели. Запущено через mouseclickevents, которые реализуются в элементах дерева.

Проблема в том, что у меня нет идеи, какие функции я должен использовать в файле controller.java, чтобы загрузить файл fxml и сделать его видимым в правой части разделяемой панели.

EDIT:

Вот мой код:

То будет FXML MainFrame:

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import java.lang.*?> 
 
<?import javafx.scene.control.*?> 
 
<?import javafx.scene.layout.*?> 
 
<?language javascript?> 
 

 
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MenuItems.Menu_Item_Controller"> 
 
    <children> 
 
     <SplitPane dividerPositions="0.2593984962406015" layoutY="-7.0" prefHeight="600.0" prefWidth="800.0" AnchorPane.bottomAnchor="7.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="-7.0"> 
 
      <items> 
 
       <AnchorPane fx:id="Preferences_Left" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
 
        <children> 
 
          <TreeView fx:id="Preference_Tree" layoutY="23.0" prefHeight="575.0" prefWidth="204.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="23.0"> 
 
           <root> 
 
            <TreeItem value="Case Full Name"> 
 
             <children> 
 
              <TreeItem value="Test1"> 
 
               <children> 
 
                <TreeItem> 
 
                 <value> 
 
                  <Label fx:id="XML_Center_Fields" onMouseClicked="#XML_Center_Fields" prefWidth="180" text="Test" /> 
 
                 </value> 
 
                </TreeItem> 
 
                <TreeItem> 
 
                 <value> 
 
                  <CheckBox id="checkBox2" prefWidth="180.0" text="TWO" /> 
 
                 </value> 
 
                </TreeItem> 
 
                <TreeItem> 
 
                 <value> 
 
                  <CheckBox id="checkBox3" prefWidth="180.0" text="THREE" /> 
 
                 </value> 
 
                </TreeItem> 
 
              </children> 
 
              </TreeItem> 
 
             </children> 
 
            </TreeItem> 
 
           </root> 
 
          </TreeView> 
 
        </children> 
 
        </AnchorPane> 
 
       <AnchorPane fx:id="Preferences_Right" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
 
       <children> 
 
        <AnchorPane fx:id="XML_Center_Field" layoutX="64.0" layoutY="23.0" prefHeight="575.0" prefWidth="588.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="23.0"> 
 
        </AnchorPane> 
 
       </children> 
 
      </AnchorPane> 
 
      </items> 
 
     </SplitPane> 
 
    </children> 
 
</AnchorPane>

Это FXML я хочу назвать:

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import javafx.scene.layout.*?> 
 
<?import java.lang.*?> 
 
<?import javafx.scene.control.*?> 
 

 
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="218.0" prefWidth="239.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
 
    <children> 
 
     <Button layoutX="130.0" layoutY="122.0" mnemonicParsing="false" text="Button" /> 
 
    </children> 
 
</AnchorPane>

И это контроллер файл, который использует действие из первого FXML назвать другими с целью визуализировать его в правой части разделенного окна.

package MenuItems; 
 

 
import javafx.event.Event; 
 
import javafx.fxml.FXML; 
 
import javafx.fxml.FXMLLoader; 
 
import javafx.fxml.JavaFXBuilderFactory; 
 
import javafx.scene.Node; 
 
import javafx.scene.Parent; 
 
import javafx.scene.control.Label; 
 
import javafx.scene.control.TitledPane; 
 
import javafx.scene.control.TreeView; 
 
import javafx.scene.layout.AnchorPane; 
 
import javafx.scene.layout.BorderPane; 
 
import javafx.scene.layout.Pane; 
 

 
import java.io.IOException; 
 
import java.io.InputStream; 
 
import java.net.URL; 
 

 
/** 
 
* Created by tkeller2 on 25.11.2014. 
 
*/ 
 
public class Menu_Item_Controller extends Pane { 
 
    public AnchorPane Preferences_Left; 
 
    public TreeView Preference_Tree; 
 
    public AnchorPane Preferences_Right; 
 
    public AnchorPane XML_Center_Field; 
 

 
    TitledPane titledPane = new TitledPane(); 
 

 

 
    public void XML_Center_Fields(Event event) throws Exception { 
 
     final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Test.fxml")); 
 

 

 
     fxmlLoader.setRoot(XML_Center_Field); 
 
     fxmlLoader.setController(this); 
 
     try { 
 
      fxmlLoader.load(); 
 
     } catch(IOException exception) { 
 
      throw new RuntimeException(exception); 
 
     } 
 

 
     getChildren().add(XML_Center_Field 
 
     ); 
 
    } 
 

 

 

 

 

 

 
}

Я знаю, что это не работает. Сообщение об ошибке ясно:

Вызвано: javafx.fxml.LoadException: значение корня уже указано.

Но у меня нет никакой подсказки. Предложения?


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

Пожалуйста, взгляните на мой код.

То будет FXML MainFrame:

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import java.lang.*?> 
 
<?import javafx.scene.control.*?> 
 
<?import javafx.scene.layout.*?> 
 
<?language javascript?> 
 

 
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MenuItems.Menu_Item_Controller"> 
 
    <children> 
 
     <SplitPane dividerPositions="0.2593984962406015" layoutY="-7.0" prefHeight="600.0" prefWidth="800.0" AnchorPane.bottomAnchor="7.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="-7.0"> 
 
      <items> 
 
       <AnchorPane fx:id="Preferences_Left" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
 
        <children> 
 
          <TreeView fx:id="Preference_Tree" layoutY="23.0" prefHeight="575.0" prefWidth="204.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="23.0"> 
 
           <root> 
 
            <TreeItem value="Case Full Name"> 
 
             <children> 
 
              <TreeItem value="Test1"> 
 
               <children> 
 
                <TreeItem> 
 
                 <value> 
 
                  <Label fx:id="XML_Center_Fields" onMouseClicked="#XML_Center_Fields" prefWidth="180" text="Test" /> 
 
                 </value> 
 
                </TreeItem> 
 
                <TreeItem> 
 
                 <value> 
 
                  <CheckBox id="checkBox2" prefWidth="180.0" text="TWO" /> 
 
                 </value> 
 
                </TreeItem> 
 
                <TreeItem> 
 
                 <value> 
 
                  <CheckBox id="checkBox3" prefWidth="180.0" text="THREE" /> 
 
                 </value> 
 
                </TreeItem> 
 
              </children> 
 
              </TreeItem> 
 
             </children> 
 
            </TreeItem> 
 
           </root> 
 
          </TreeView> 
 
        </children> 
 
        </AnchorPane> 
 
       <AnchorPane fx:id="Preferences_Right" minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 
 
       <children> 
 
        <AnchorPane fx:id="XML_Center_Field" layoutX="64.0" layoutY="23.0" prefHeight="575.0" prefWidth="588.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="23.0"> 
 
        </AnchorPane> 
 
       </children> 
 
      </AnchorPane> 
 
      </items> 
 
     </SplitPane> 
 
    </children> 
 
</AnchorPane>

Это FXML я хочу назвать:

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import javafx.scene.layout.*?> 
 
<?import java.lang.*?> 
 
<?import javafx.scene.control.*?> 
 

 
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="218.0" prefWidth="239.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> 
 
    <children> 
 
     <Button layoutX="130.0" layoutY="122.0" mnemonicParsing="false" text="Button" /> 
 
    </children> 
 
</AnchorPane>

И это т он контроллер Файл, который использует действие от первого FXML, чтобы вызвать другого с целью визуализировать его в правой части области сплит-панели.

package MenuItems; 
 

 
import javafx.event.Event; 
 
import javafx.fxml.FXML; 
 
import javafx.fxml.FXMLLoader; 
 
import javafx.fxml.JavaFXBuilderFactory; 
 
import javafx.scene.Node; 
 
import javafx.scene.Parent; 
 
import javafx.scene.control.Label; 
 
import javafx.scene.control.TitledPane; 
 
import javafx.scene.control.TreeView; 
 
import javafx.scene.layout.AnchorPane; 
 
import javafx.scene.layout.BorderPane; 
 
import javafx.scene.layout.Pane; 
 

 
import java.io.IOException; 
 
import java.io.InputStream; 
 
import java.net.URL; 
 

 
/** 
 
* Created by tkeller2 on 25.11.2014. 
 
*/ 
 
public class Menu_Item_Controller extends Pane { 
 
    public AnchorPane Preferences_Left; 
 
    public TreeView Preference_Tree; 
 
    public AnchorPane Preferences_Right; 
 
    public AnchorPane XML_Center_Field; 
 

 
    TitledPane titledPane = new TitledPane(); 
 

 

 
    public void XML_Center_Fields(Event event) throws Exception { 
 
     final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Test.fxml")); 
 

 

 
     fxmlLoader.setRoot(XML_Center_Field); 
 
     fxmlLoader.setController(this); 
 
     try { 
 
      fxmlLoader.load(); 
 
     } catch(IOException exception) { 
 
      throw new RuntimeException(exception); 
 
     } 
 

 
     getChildren().add(XML_Center_Field 
 
     ); 
 
    } 
 

 

 

 

 

 

 
}

Я знаю, что это не работает. Сообщение об ошибке ясно:

Вызвано: javafx.fxml.LoadException: значение корня уже указано.

Но у меня нет никакой подсказки. Предложения?

+1

Вы просто создаете «FXMLLoader», загружаете FXML и показываете результаты - так же, как я предполагаю, что вы делаете в методе start. Неясно, в какой части вы застряли. –

+0

Привет, я застрял в файле контроллера. Попробуем выразить свою проблему. Я просто пишу графический интерфейс для объединения других программ. Здесь я хочу предоставить классическое окно предпочтений, пользователь может сделать настройки для графического интерфейса. С левой стороны Пользователь может выбрать с правой стороны, пользователь может установить настройку. Я хочу, чтобы пользователь мог выбрать элемент дерева с левой стороны, что приводит к тому, что конкретная настройка отображается с правой стороны. Любые из этих возможных настроек, которые я хотел определить в отдельных файлах FXML и Controller. Чтобы включить файл FXML, я хочу использовать FXMLLoader. – Schneeelf

+0

Не вызывайте 'setRoot', если вы не используете динамический корень (' ') в файле fxml. Просто используйте загрузчик так же, как вы его используете в своем основном файле запуска. –

ответ

0

Я делаю это так:

public class Task extends Pane { 

    TitledPane titledPane; 

    public Task() { 

     final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Task.fxml")); 

     titledPane = new TitledPane(); 

     fxmlLoader.setRoot(titledPane); 
     fxmlLoader.setController(this); 
     try { 
      fxmlLoader.load(); 
     } catch(IOException exception) { 
      throw new RuntimeException(exception); 
     } 

     getChildren().add(titledPane); 

    } 

    ... 

} 

Задача только пользовательский объект TitledPane, который создается с помощью FXML. Я поставил несколько объектов Task на сцену.

Я не уверен, что это правильный способ для JavaFX 8, но он работает.

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