2014-09-05 2 views
0

У меня есть элемент управления JavaFX, который в основном объединяет несколько других элементов управления JavaFX.Как настроить элемент управления JavaFX для импорта в Scene Builder?

Я хочу, чтобы файл .jar можно было импортировать в Scene Builder, чтобы он мог использоваться как любой другой элемент управления. Ближайшая аналогия, о которой я могу думать, - это когда вы создаете собственный элемент управления на C# и используете его несколько раз в нескольких проектах.

Когда я пытаюсь импортировать файл FXML, он не работает. Элемент управления не рассматривается как единый объект, а вместо этого в основном просто все его части, нарисованные в файле FXML.

Что мне нужно сделать с файлом FXML или с файлом controller.java, чтобы Scene Builder смог импортировать .jar, увидеть элементы управления и разрешить мне импортировать и использовать каждый пользовательский контроль как единый объект? Я несколько раз искал несколько мест и даже спрашивал о переполнении стека (хотя ответ, который я получил, не был тем, для которого я искал, и с тех пор не получил никаких ответов), но ничего, что я видел, близко подходит для обработки моей проблемы ,

Ближайший я пришел должен делать с этой строки в файле FXML:

<?scenebuilder-classpath-element /path/to/something?> 

, но я не знаю, что происходит в /path/to/something

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

+0

Вы видели этот вопрос? http: // stackoverflow.ком/вопросы/19342259/как к создать многодисковые JavaFX-контроллеры-с-различные-FXML-файлами Рафаэля –

+0

Я понимаю, что они делают, и от наблюдения код, насколько я могу сказать только вещь, которую я пропустил, заключалась в том, чтобы объявить контроллер в FXML (который я теперь сделал с помощью Scene Builder). Я скомпилировал .jar и попытался импортировать его снова. Я ничего не получил. Он открыл банку и не дал мне ничего для импорта. Поэтому, хотя это помогло мне обнаружить, что я не объявляю контроллер, это все равно не помогло мне решить мою проблему. Однако, спасибо. – Will

+0

Затем проверьте это http://stackoverflow.com/questions/16673407/javafx-custom-control-textfield-not-working –

ответ

0

Я, наконец, смог решить проблему. После долгих проб и ошибок и после кода примера, который пришел с here, я обнаружил, что проблема в том, что мне нужно было 2 класса для каждой группы управления FXML. Один из них является фактическим контроллером группы, а другой - объектом, в котором будет находиться контроллер. Я следовал за кодом в примере Unlock, и это помогло мне помочь. В основном это сводится к двум файлам:

объект (который расширяет тип корневого узла, в моем случае):

public class <InsertObjectClassNameHere> extends <RootContainerTypeHere>{ 
} 

После этого вам нужен класс контроллера. Это то, что я больше всего знаю, однако я все еще делал это неправильно. Это то, что нужно implement initializable:

public class <InsertControllerClassNameHere> implements Initializable{ 

} 

Так что для меня класс объекта выглядит следующим образом:

public class DGCSDefiner extends GridPane { 
    private final DGCSDefinerController Controller; 
    public DGCSDefiner(){ 
     this.Controller = this.Load(); 
    } 

    private DGCSDefinerController Load(){ 
     final FXMLLoader loader = new FXMLLoader(); 
     loader.setRoot(this); 
     loader.setClassLoader(this.getClass().getClassLoader()); 
     loader.setLocation(this.getClass().getResource("DGCSDefiner.fxml")); 

     try{ 
      final Object root = loader.load(); 
      assert root == this; 
     } catch(IOException ex){ 
      throw new IllegalStateException(ex); 
     } 

     final DGCSDefinerController cntrlr = loader.getController(); 
     assert cntrlr != null; 
     return cntrlr; 
    } 

    /** 
    * Get the settings defined by the controller. 
    * @return controller defined settings. 
    */ 
    public ColorSettings getColorSettings(){ 
     return this.Controller.getColorSettings(); 
    } 

    /** 
    * Set the controllers color settings. 
    * @param CS Defined color settings. 
    */ 
    public void setColorSettings(ColorSettings CS){ 
     this.Controller.setColorSettings(CS); 
    } 
} 

, а затем есть фактический класс контроллера.

Таким образом, для прямого прямого ответа,

вам нужно иметь класс, который будет нагружать ваш контроллер, и вы должны пройти вниз от контроллера к этому классу, с которым вы будете работать (Или вы можете просто держать контроллер открытым и напрямую обращаться к нему).

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