Let's create a databound combobox, levering MVC in a desktop application.
The result will be a combobox, provided by the NetBeans ChoiceView, that displays data retrieved from a database:
What follows is not much different from the NetBeans Platform CRUD Application Tutorial and you're advised to consult that document if anything that follows isn't clear enough.
One kind of interesting thing about the instructions that follow is that it shows that you're able to create an application where each element of the MVC architecture can be located within a separate module:
Start by creating a new NetBeans Platform application named "MyApplication".
Model
We're going to start by generating JPA entity classes from a database connection. In the New Project wizard, choose "Java Class Library". Click Next. Name the Java Class Library "MyEntities". Click Finish. Right-click the MyEntities project, choose New, and then select "Entity Classes from Database". Work through the wizard, selecting the tables of interest from your database, and naming the package "entities". Click Finish. Now a JPA entity is created for each of the selected tables. In the Project Properties dialog of the project, choose "Copy Dependent Libraries" in the Packaging panel. Build the project. In your project's "dist" folder (visible in the Files window), you'll now see a JAR, together with a "lib" folder that contains the JARs you'll need.
In your NetBeans Platform application, create a module named "MyModel", with code name base "org.my.model". Right-click the project, choose Properties, and in the "Libraries" panel, click Add Dependency button in the Wrapped JARs subtab to add all the JARs from the previous step to the module. Also include "derby-client.jar" or the equivalent driver for your database connection to the module.
Controler
In your NetBeans Platform application, create a module named "MyControler", with code name base "org.my.controler". Right-click the module's Libraries node, in the Projects window, and add a dependency on "Explorer & Property Sheet API".
In the MyControler module, create a class with this content:
package org.my.controler;
import org.openide.explorer.ExplorerManager;
public class MyUtils {
static ExplorerManager controler;
public static ExplorerManager getControler() {
if (controler == null) {
controler = new ExplorerManager();
}
return controler;
}
}
View
In your NetBeans Platform application, create a module named "MyView", with code name base "org.my.view". Create a new Window Component, in "explorer" view, for example, let it open on startup, with class name prefix "MyView". Add dependencies on the Nodes API and on the Explorer & Property Sheet API. Also add dependencies on the "MyModel" module and the "MyControler" module. Before doing so, in the "MyModel" module, make the "entities" package and the "javax.persistence" packages public (in the Libraries panel of the Project Properties dialog) and make the one package that you have in the "MyControler" package public too.
Define the top part of the MyViewTopComponent as follows:
public final class MyViewTopComponent extends TopComponent implements ExplorerManager.Provider {
ExplorerManager controler = MyUtils.getControler();
public MyViewTopComponent() {
initComponents();
setName(Bundle.CTL_MyViewTopComponent());
setToolTipText(Bundle.HINT_MyViewTopComponent());
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
controler.setRootContext(new AbstractNode(Children.create(new ChildFactory<Customer>() {
@Override
protected boolean createKeys(List list) {
EntityManager entityManager = Persistence.
createEntityManagerFactory("MyEntitiesPU").createEntityManager();
Query query = entityManager.createNamedQuery("Customer.findAll");
list.addAll(query.getResultList());
return true;
}
@Override
protected Node createNodeForKey(Customer key) {
Node customerNode = new AbstractNode(Children.LEAF, Lookups.singleton(key));
customerNode.setDisplayName(key.getName());
return customerNode;
}
}, true)));
controler.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
Customer selectedCustomer =
controler.getSelectedNodes()[0].getLookup().lookup(Customer.class);
StatusDisplayer.getDefault().setStatusText(selectedCustomer.getName());
}
});
JPanel row1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
row1.add(new JLabel("Customers: "));
row1.add(new ChoiceView());
add(row1);
}
@Override
public ExplorerManager getExplorerManager() {
return controler;
}
...
...
...
Now run the application and you'll see the same as the image with which this blog entry started.