Можно объявить целый класс как static или без static но в нем некоторые переменные, методы, как static и иметь к ним доступ со всех частей программы в любой момент времени. Т.е. и таким образом выстроить взаимодействие между различными контроллерами окон. В этом классе можете хранить только нужные ссылки на объекты и использовать их в нужно время, соответственно будет и нужное Вам ограниченное взаимодействие.
Я постоянно пользуюсь данным способом для осуществления коммуникации между окнами, вполне рабочее решение, без затраты ресурсов и времени.
Пример: например в блоке initialize создаете этот наш общий класс, через конструктор или через метод устанавливаете все нужные ссылки на нужные объекты, например какие-нибудь поля или нужные переменные. Затем в другом контроллере окна в любом месте Вы уже можете получить доступ к уже общим полям, переменным и тому, что Вы сочли нужным.
Я как понимаю Вы новичок, то вот держите простой пример:
public static class outStaticClass{
public Button commonButton; //Общая кнопка.
}
public class controllerWindow1 implements Initializable{
private Button ourButtonForCommonClass;
...
@Override
public void initialize(URL url, ResourceBundle rb) {
ourButtonForCommonClass = new Button("First button");
outStaticClass oSC = new outStaticClass();
outStaticClass.commonButton = ourButtonForCommonClass; // Сохранили ссылку на объект
}
}
public class controllerWindow2 implements Initializable{
...
//В любом месте outStaticClass oSC = new outStaticClass();
//и у нас есть доступ к объекту из первого окна controllerWindow1
//можем изменить его текст или сделать disabled
//лучше сделать не прямое взаимодействие через наш общий класс.
}
По поводу лицензии я без понятия если честно, задайте отдельно вопрос, тоже кстати интересно.
Дополнение
Можете также, через static связать по средством
bind многие поля, значения и так далее.