MVC development with JavaFX

Hello all!
I like to use the MVC design pattern, i.e. separating data (Model), graphics (View) and input (Controller). While I want the View and Controller classes to be a JavaFX components, I want the rest of the program to be Java code.
So, if I create a Java application, how do I initialize the JavaFX components from the Java code?
Warm regards,
Jon Kristensen

We recommend you do the reverse. Create a JavaFX application which then calls down to Java code through constructors or static factory methods.

Similar Messages

  • If you make a game with JavaFX 1.0, do you need to release the source code?

    Hello All,
    I am trying to get a good understanding of the GPL since
    that is the license that JavaFX 1.0 will be released under.
    Is it true that if we create a game using JavaFX 1.0,
    we will need to make our source code for the game
    available alongside it?
    Does anyone know?

    The answer is NO.
    The GPL only applies in this case to external modification of JavaFX, and not application developed with the technology. This clue is taken from OpenJDK which is GPL. In the same way, applications developed with Java technology and run under GPLed OpenJDK need not expose their source code. Morever JavaFX development and runtime are likely to be part of Java7.
    Anyway, the GPL issue will be clarified once JavaFX is released. I remember Joshua Marinacci mentions something about some change in license.

  • Beginning with JavaFX

    Hi,
    I have any questions on JavaFX following:
    - It's possible to integrate JavaFX with J2ME under eclipse IDE?
    - There are possibility to develop mobiles appplications under eclipse with only JavaFX?
    Or I must add J2ME in order to combine with JavaFX under eclipse IDE?
    - It's possible to obtain documentation which explain how to use JavaFX with J2ME under eclipse?
    THanks.

    You could try this for binding:
    http://ugate.wordpress.com/2012/07/30/javafx-programmatic-pojo-expression-bindings-part-iii/
    So far I've only used it with flatter data structures than you describe, but it should do what you want.  Java 8 might also support the use of Bindings.selectXXX to bind to  POJO objects, but I haven't tried it and can't comment on how it works.  See this JIRA issue:
    https://javafx-jira.kenai.com/browse/RT-19049

  • Script languages with JavaFX

    Hello everyone,
    The use of script languages is bound to be a newbie question so I used a general the thread topic.
    In my case I have two questions. I want to find the relevant documentation to find answers to these questions. Note: where to find the information (if available).
    * How can I hook JRuby into an FXML user interface design?
    I was following the javascript part of the tutorial,
    * "Getting Started: Using FXML" (http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm)
    That was OK but when I tried a few simple modifications, I got stuck.
    * Which document shows me what functions are available to the executing javascript? The following simple example does NOT work:
    function handleSubmitButtonAction( ev ) {
        alert("something");
        actiontarget.setText( "Calling the Javascript function." );
    The runtime gets an exception on alert( ). Until now I pretty much felt that alert( ) was part of the baseline. I'm happy enough to locate the documentation that tells me how to call 'standard' javascript functions.
    And I'd love to hear from anyone who's used JRuby with JavaFX or FXML.
    Kind regards,
    Will.

    How can I hook JRuby into an FXML user interface design?The answer to that question lies in the stackoverflow question "Using fxml with jruby"
    http://stackoverflow.com/questions/13831708/using-fxml-with-jruby
    Which document shows me what functions are available to the executing javascript? I don't know, I doubt there is one.
    I suggest you just treat the javascript environment as headless (incapable of invoking javascript functions such as alert which might generate a UI).
    If you want to pop up an alert, create an alert dialog in JavaFX and invoke that from your script.
    For a JavaFX standard dialog box library see: http://fxexperience.com/2012/10/announcing-the-javafx-ui-controls-sandbox/
    I believe (and I could be wrong) that JavaFX 2.2 is using a modification of the Rhino engine, which you can find documentation on here:
    https://developer.mozilla.org/en-US/docs/Rhino
    I believe (and I could be wrong) that JavaFX 8 will use a Nashorn engine:
    http://openjdk.java.net/projects/nashorn/

  • Commercial multiplatform product for desktop with JavaFx technology

    Is there a commercial multiplatform desktop application based on JavaFx technology with Standard Execution model?

    Because I'm happy with Flex for my RIA front-ends, I have not spent much time on JavaFX. However, I do believe your understanding of its state is largely correct. If you haven't done so already, you may want to check out the JavaFX FAQ. You may also want to check out the [OpenJFX java.net forum|http://forums.java.net/jive/category.jspa?categoryID=62] and possibly pose your questions there.
    My understanding is that JavaFX Desktop and Java SE [JRE Consumer Edition|http://www.theregister.co.uk/2007/05/09/sun_java_se_glassfish/] are [two separate things|http://blogs.sun.com/sfehrman/entry/javaone_day_one], but with JavaFX Desktop depending on Java SE 6 Update 10/Consumer Edition. [Java SE 6 Update 10|http://java.sun.com/developer/technicalArticles/javase/java6u10/index.html], [formerly known as Java SE 6 Update N|http://weblogs.java.net/blog/chet/archive/2007/10/early_access_gr.html], is the the [consumer edition|https://jdk6.dev.java.net/6u10ea.html] and was-so named because it was designed to optimize user experience with the JRE.

  • There any way to re-sign the app developed with Adobe DPS?

    Hi Everyone , I explain a problem that I have with DPS Single Edition ( it useful that is until May ) to see if anyone knows a solution. I have developed an app for a client , but the client wants to publish the app in Apple Developer with your name . How to export the .ipa or .zip Dps asks certificates Apple account and logically put mine ... (customer is a large company and I do not give me your passwords Apple etc ) you know if there any way they can re-sign the app ? As you do when you develop an app for a client who wants to publish on their own?

    Ok they'll ask my client to send me those files.
    With notifications no problem because the app does not.
    With respect to  Itunes connect and publication in the AppStore, will my client who is responsible for publishing the app, complete data etc. from their own.
    Your help has been very helpful to me. 

  • How to get all tables in oracle sql developer with MS SQLServer

    Hi All,
    I am using microsoft SQL server 2000. For displaying the tables and other stuff i am using oracle SQL developer tool. The problem is when i connect to sql developer with oracle database i can see all the tables in that database. But when i connect to MS SQL server database it is not showing all the tables in that database. I don't know why?.
    i tried doing the samething using another tool called Aqua Data Studio , there i can able to see all the tables in microsoft SQL server 2000.
    do you have any knowledge regarding this, why i am not getting all the tables in oracle sql developer when i connect to microsoft SQL server 2000.

    Same issue here. Haven't found the answer yet..

  • Where can I find a good tutorial for mobile game developement with J2ME ?

    Hi All,
    I'm completely new to J2ME programming. But I have past experience on J2SE developement. Now I would like to know that where can I find a good tutorial for mobile game developement with J2ME ?
    I'll be very greatful if I can find a useful step-by-step tutorial (eg. "The Java Tutorial" for J2SE)
    Please point me ot the direction.
    Thanks
    ZuriJAckshoT

    ibook-widgets.com    have a free tutorial book in the iBooks store.  Search for "Create your first interactive book using iBooks Author"   they also  sell widgets.
    I  dont have any connection - I  found their eBook in the store long ago  and used it to learn more about iBA.
    The best advice though, is be patient,  go back over the process step by step, I cannot  access the Help files for some reason.. but i am sure its in their.

  • How can I run a vi developed with 7 Express?

    How can I run a vi developed with LabView 7 Express on another machine ? Do runtime versions exist ?

    Apparently, you want to run it on a machine that does not have LabVIEW installed.
    To make a standalone executable of your LabVIEW program, you need to have the Application builder (included in LabVIEW professional and higher, avaliable as an add-on for base and full).
    To run the application, the target system need to have the LabVIEW 7.0 runtime installed (available as a free download).
    There is also the LabVIEW Player. In this case you need to digitally sign your VIs and there are a few limitations. It is meant for for sharing code ideas and is not a viable substitute for the appl
    ication builder.
    Of course you could also get a second copy of LabVIEW.
    Some other options that would work in a very narrow set of situations: Read your LabVIEW license agreement. Under certain conditions you are allowed to install a second copy of LabVIEW on your home computer. If this is for personal educational use only and you qualify, you could also buy the LabVIEW student edition.
    LabVIEW Champion . Do more with less code and in less time .

  • Error after deploying a JSP Application developed with jdeveloper

    Hi there
    Running Oracle Enterpride Edition 8.1.7
    including Oracle Http webserver
    I'm trying to run a JSP application developed with Jdeveloper
    through the oracle http server included in
    Oracle Enterpride Edition 8.1.7
    Think I have modified alle the .conf files correctly
    I get the message :
    "Error Message: java.lang.RuntimeException: JSP Registry could not locate runtime property file:ORDERS_ORDERS_PKG_ORDERS_PKGModule.properties"
    Of course I know ,this file should be deployed as well. I have done this.
    Any ideas what's wrong ?
    Or can anyone point me to a (proper) document that decribes (correctly and completely) alle the steps that need to be done ?
    Many Thanxs
    Regards TJ
    null

    Yep, I had the same problem deploying from JDeveloper 9.3.1, followed:
    http://www.oracle.com/technology/products/jdev/howtos/10g/adf_runtime_update_howto.html
    and it works! thanks for the clue! (now I only have to find out what ADF is now!)
    Carlos.

  • Developing with JDev 10.1.3.0.1 for BPEL 10.1.2.0.2

    Hi,
    Does anyone knows if it is possible or adviseble to develop with JDev 10.1.3.0.1 to deploy the processes in OC4J BPEL 10.1.2.0.2?
    If it is, is there any issues involved?
    Tks

    in general you could develop bpel 10.1.2.02 compliant processes, but it would create a bunch of possible hazards you could run into - deployment structure, new services, workflow and so on .. add'ly you cannot deploy from jdev 10.1.3.1 to bpel 10.1.2.0.2 server -- all in all not really recommendable, and not really supported too :D
    /clemens
    SOA Product Management

  • Can anyone solve this simple MVC problem with ArrayCollection

    I have very simple application trying to understand how to apply MVC without any framework. There are quite a few exemples on the net but most do not deal with complex data.
    here is my application with 4 files: MVCtest.mxml, MyController.as, MyModel.as and MyComponent.as
    first the Model MyModel.as
    package model
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import mx.collections.ArrayCollection;
    [Event(name="ArrayColChanged", type="flash.events.Event")]
    [Bindable]
    public class MyModel extends EventDispatcher
      private static var instance:MyModel;
      public static const ARRAYCOL_CHANGED:String = "ArrayColChanged";
      private var _myArrayCol:ArrayCollection;
      public function MyModel(target:IEventDispatcher=null)
       super(target);
       instance = this;
      public static function getInstance():MyModel
       if(instance == null)
        instance = new MyModel();
       return instance;
      public function get myArrayCol():ArrayCollection
       return _myArrayCol;
      public function set myArrayCol(value:ArrayCollection):void
       _myArrayCol = new ArrayCollection(value.source);
       dispatchEvent(new Event(ARRAYCOL_CHANGED));
    then the controller: MyController.as
    package controller
    import components.MyComponent;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import model.MyModel;
    import mx.collections.ArrayCollection;
    import mx.controls.Alert;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.remoting.RemoteObject;
    public class MyController extends EventDispatcher
      [Bindable]
      public var view:MVCtest;
      [Bindable]
      public var componentView:MyComponent;
      private var _model:MyModel = MyModel.getInstance();
      public function MyController(target:IEventDispatcher=null)
       super(target);
       _model.addEventListener("ArrayColChanged", onArrayColChange);
      public function initialise(event:Event):void
       getData();
      public function getData():void
       var dataRO:RemoteObject = new RemoteObject;
       dataRO.endpoint = "gateway.php";
       dataRO.source = "MytestdbService";
       dataRO.destination = "MytestdbService";
       dataRO.addEventListener(ResultEvent.RESULT, dataROResultHandler);
       dataRO.addEventListener(FaultEvent.FAULT, dataROFaultHandler);
       dataRO.getAllMytestdb();   
      public function dataROResultHandler(event:ResultEvent):void
       _model.myArrayCol = new ArrayCollection((event.result).source);
      public function dataROFaultHandler(event:FaultEvent):void
       Alert.show(event.fault.toString());
      public function onArrayColChange(event:Event):void
       componentView.myDataGrid.dataProvider = _model.myArrayCol;
    This is the main application: MVCtest.mxml
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:s="library://ns.adobe.com/flex/spark"
          xmlns:mx="library://ns.adobe.com/flex/mx"
          xmlns:controller="controller.*"
          xmlns:components="components.*"
          width="600" height="600"
          creationComplete="control.initialise(event)">
    <fx:Declarations>
      <controller:MyController id="control" view = "{this}"/>
    </fx:Declarations>
    <fx:Script>
      <![CDATA[
       import model.MyModel;
       import valueObjects.MyVOorDTO;
       [Bindable]
       private var _model:MyModel = MyModel.getInstance();
      ]]>
    </fx:Script>
    <s:VGroup paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
      <s:Label fontSize="20" fontWeight="bold" text="MVC Test with components"
         verticalAlign="middle"/>
      <components:MyComponent/>
    </s:VGroup>
    </s:Application>
    And this is the component: MyComponent.mxml
    <?xml version="1.0" encoding="utf-8"?>
    <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
       xmlns:s="library://ns.adobe.com/flex/spark"
       xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
    <s:layout>
      <s:VerticalLayout paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"/>
    </s:layout>
    <fx:Declarations>
      <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Label fontSize="16" fontWeight="bold" text="My Component " verticalAlign="bottom"/>
    <s:DataGrid id="myDataGrid" width="100%" height="100%" requestedRowCount="4">
      <s:columns>
       <s:ArrayList>
        <s:GridColumn dataField="mystring" headerText="String"></s:GridColumn>
        <s:GridColumn dataField="myinteger" headerText="Integer"></s:GridColumn>
        <s:GridColumn dataField="myreal" headerText="Real"></s:GridColumn>
        <s:GridColumn dataField="mydate" headerText="Date"></s:GridColumn>
       </s:ArrayList>
      </s:columns>
    </s:DataGrid>
    </s:Group>
    Here is the code to generate the database:
    CREATE DATABASE mytest;
    CREATE TABLE myTestDB
          myid INT UNSIGNED NOT NULL AUTO_INCREMENT,
          mystring CHAR(15) NOT NULL,
          myinteger INT NOT NULL,
          myreal DECIMAL(6,2) NOT NULL,
          mydate DATE NOT NULL,
          PRIMARY KEY(myid)
    ) ENGINE = InnoDB;
    INSERT INTO myTestDB (mystring, myinteger, myreal, mydate) VALUES ('Test', 123, 45.67, '2012-01-01'), ('Practice', 890, 12.34, '2012-02-01'), ('Assay', 567, 78.90, '2011-10-01'), ('Trial', 111, 22.22, '2009-09-09'), ('Experiment', 333, 44.44, '1999-04-15'), ('Challenge', 555, 66.66, '2012-12-21');
    And finally here is the PHP script.
    <?php
    class myVOorDTO
      var $_explicitType = "valueObjects.myVOorDTO";
      public $myid;
      public $mystring;
      public $myinteger;
      public $myreal;
      public $mydate;
      public function __construct()
        $this->myid = 0;
        $this->mystring = "";
        $this->myinteger = 0;
        $this->myreal = 0.0;
        $this->mydate = date("c");
    class MytestdbService
      var $username = "yourusername";
      var $password = "yourpassword";
      var $server = "yourserver";
      var $port = "yourport";
      var $databasename = "mytest";
      var $tablename = "mytestdb";
      var $connection;
      public function __construct()
        $this->connection = mysqli_connect(
        $this->server, $this->username, $this->password, $this->databasename, $this->port);
    * Returns all the rows from the table.
    * @return myVOorDTO
      public function getAllMytestdb()
        $query = "SELECT * from $this->tablename";
        $result = mysqli_query($this->connection, $query);
        $results = array();
        while ($obj = mysqli_fetch_assoc($result))
          $row = new myVOorDTO();
          $row->myid = $obj['myid'] + 0;
          $row->mystring = $obj['mystring'];
          $row->myinteger = $obj['myinteger'] + 0;
          $row->myreal = $obj['myreal'] + 0.0;
          $row->mydate = new Datetime($obj['mydate']);
          array_push($results, $row);
        return $results;
    ?>
    My understanding as to what is going on is: (1) on creation complete the application launch the initialise() function of the controller (2) this function starts the remoteObject which get the data (3) once the results arrive the resultHandler store the data into the ArrayCollection of the model ***this does not work*** (4) even if part 3 did not work, the setter of the ArrayCollection in the model send an event that it has been changed (5) the controller receive this event and assigns the ArrayCollection of the model as the dataprovider for the datagrid in the compoent.
    Of course, since the ArrayCollection is null, the application gives an error as the dataProvider for the datagrid is null.
    What is missing in this application to make it work properly? I believe this is an example that could help a lot of people.
    Even if I change the setter in the model to _myArrayCol = ObjectUtil.copy(value) as ArrayCollection; it still does not work.
    Also, it seems that the remoteObject does not return a typed object (i.e. myVOorDTO) but rather generic objects. I am usually able to make this works but in this particular application I have not managed to do it. Again what's missing?
    Thanks for any help with this!

    Calendar c = GregorianCalendar.getInstance();
    c.set(Calendar.YEAR,2000);
    System.out.println(c.getActualMaximum(Calendar.WEEK_OF_YEAR));
    c.set(Calendar.YEAR,2001);
    System.out.println(c.getActualMaximum(Calendar.WEEK_OF_YEAR));But it says that 2000 has 53 weeks and 2001 has 52.

  • Unable Update SQL Developer with Times Ten in-Memory DB Extension 1.2.1.1.0

    SQL Developer 1.2.1 Build MAIN 32.13 (Windows XP)
    We can't Update SQL Developer with Times Ten in-Memory DB Extension 1.2.1.1.0 :-((
    We did the same actions as described in tutorial
    http://www.oracle.com/technology/products/timesten/viewlets/tt703_sqldev_install_ext_viewlet_swf.html
    In addition to tutorial we have "Log In" window
    "To download Oracle Times Ten in-Memory Database Extension
    you must enter your Oracle Web Account user name and password"
    This window was not displayed in tutorial...
    We try to use three our OTN accounts and the result
    was the same - we was asked with "User name" and "Password"
    again, again, again and again,,, :-(
    Is it a bug or a feature?
    Mayby we didn't understand something or did something wrong?

    Hi Simon,
    I found cause of update failure! It was the HTTP proxy setting.
    I turned off "Use HTTP proxy server" checkbox in SQL Developer -> Tools -> Preferences -> Web Browser and Proxy.
    After this action SQL Developer was successfully updated with Times Ten Extension.
    Valery Yourinsky

  • Business development with Apple

    Dear Sir,
    I tried to look for an email address to send my proposal for business development with your company but, unfortunately, I can't find any at the website. May I ask for the email address of the person handling Business Development opportunities?
    Thank you,

    I would hope that someone wanting to do business with Apple would be competent enough to find the Contact Us link on their website and contact the company directly.

  • FOD schema installation with tutorial Database Development with JDeveloper

    I followed the instruction online at http://www.oracle.com/technetwork/developer-tools/jdev/index-095536.html to install FOD schema. Errors displayed when call "run ant target -> buildall" were below:
    populateImages:
    [java] 2010-9-26 14:56:01 oracle.as.jmx.framework.LoggerHelper log
    [java] SEVERE: Error initializing the JMX FRamework SPI "oracle.as.jmx.framework.standardmbeans.spi.JMXFrameworkProviderImpl"
    [java] java.lang.reflect.InvocationTargetException
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    [java]      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [java]      at java.lang.reflect.Method.invoke(Method.java:597)
    [java]      at oracle.as.jmx.framework.PortableMBeanFactory.initializeSPI(PortableMBeanFactory.java:1895)
    [java]      at oracle.as.jmx.framework.PortableMBeanFactory.initializePlatformSPI(PortableMBeanFactory.java:1851)
    [java]      at oracle.as.jmx.framework.PortableMBeanFactory.init(PortableMBeanFactory.java:1831)
    [java]      at oracle.as.jmx.framework.PortableMBeanFactory.<init>(PortableMBeanFactory.java:207)
    [java]      at oracle.as.jmx.framework.PortableMBeanFactory.<init>(PortableMBeanFactory.java:215)
    [java]      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    [java]      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    [java]      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    [java]      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    [java]      at java.lang.Class.newInstance0(Class.java:355)
    [java]      at java.lang.Class.newInstance(Class.java:308)
    [java]      at oracle.mds.core.MDSInstance.lookupMBeanServer(MDSInstance.java:2061)
    [java]      at oracle.mds.core.MDSInstance.checkMDSDeployStatus(MDSInstance.java:950)
    [java]      at oracle.mds.core.MDSInstance.<init>(MDSInstance.java:1692)
    [java]      at oracle.mds.core.MDSInstance.<init>(MDSInstance.java:1666)
    [java]      at oracle.mds.core.MDSInstance.findAndStoreMDSInstance(MDSInstance.java:1962)
    [java]      at oracle.mds.core.MDSInstance.getOrCreateInstance(MDSInstance.java:507)
    [java]      at oracle.mds.core.MDSInstance.getOrCreateInstance(MDSInstance.java:470)
    [java]      at oracle.adf.share.config.ADFMDSConfig.getDefaultMDSInstance(ADFMDSConfig.java:436)
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [java]      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    But still got message - "BUILD SUCCESSFUL" at the end. Does anyone know how to solve this problem?
    My intention of performing FOD schema installation was to follow the tutorial "Database Development with JDeveloper" at http://st-curriculum.oracle.com/obe/jdev/obe11jdev/ps1/databasedevelopment/obe_%20databasedevmt.htm. But I stopped at the last topic "Creating and Debugging PL/SQL Objects in the Database" ->"Running a SQL Script to Create an Object Type" when trying to create a object using script on the page.
    This is the script:
    ------------------------------------------------start
    REM
    REM Create object ORDER_ITEMS_REC
    REM
    CREATE or REPLACE type ORDER_ITEMS_REC as object
    ORDER_ID NUMBER(15),
    LINE_ITEM_ID NUMBER(3),
    PRODUCT_ID NUMBER(15),
    QUANTITY NUMBER(6),
    UNIT_PRICE NUMBER(8,2),
    CREATED_BY VARCHAR2(60),
    CREATION_DATE DATE,
    LAST_UPDATED_BY VARCHAR2(60),
    LAST_UPDATE_DATE DATE,
    OBJECT_VERSION_ID NUMBER(15)
    show errors;
    --------------------------------------------------end
    and the error message I got was
    ------------------------------------------------start
    Error report:
    ORA-01031: insufficient privileges
    01031. 00000 - "insufficient privileges"
    ------------------------------------------------end
    I was wandering whether the error of FOD installation could cause the error of the tutorial?
    Any response will be appreciated.

    1. you dont have to insall Oracle database at the BO machine side, you just need any database to hold the BO repository.
    2. you cant connect directly using BO, only Crystal reports can connect directly to R3 database, you need to have a BW in between.
    extract your data into the BW, and let BO connect to BW using the BO integration kit for SAP solutions.
    3. no you dont have to have 3 different machines, using one BO machine you connect to them all, but you may need build a  BO environment, (Development, Production servers)
    good luck

Maybe you are looking for