package aima.gui.swing.framework;
/**
* In this framework a graphical agent application consists at least of three
* parts: An {@link AgentAppEnvironmentView}, an {@link AgentAppFrame}, and an
* {@link AgentAppController}. This class plugs the three parts together. Note
* that no support for model creation is included here. Environments are used as
* models and may depend on current selector settings. So typically, the
* controller will be responsible for creating them (in method
* {@link AgentAppController#prepare(String)}) and making the view know them (by
* calling method
* {@link AgentAppEnvironmentView#setEnvironment(aima.core.agent.Environment)}).
* <p>
* The easiest way to create a new graphical agent application is to create
* subclasses of the three parts as needed, and then to create a subclass of
* this class and override the three factory methods.
* </p>
*
* @author Ruediger Lunde
*/
public class SimpleAgentApp {
/**
* Constructs an agent application and sets the application frame visible.
*/
public void startApplication() {
AgentAppFrame frame = constructApplicationFrame();
frame.centerPane.setDividerLocation(frame.centerPane.getResizeWeight());
frame.setVisible(true);
}
/**
* Creates all parts of an agent application and makes the parts know each
* other. Part construction is delegated to factory methods.
*/
public AgentAppFrame constructApplicationFrame() {
AgentAppEnvironmentView envView = createEnvironmentView();
AgentAppFrame frame = createFrame();
AgentAppController controller = createController();
frame.setEnvView(envView);
envView.setMessageLogger(frame.getMessageLogger());
frame.setController(controller);
controller.setFrame(frame);
frame.setDefaultSelection();
return frame;
}
/** Factory method, responsible for creating the environment view. */
public AgentAppEnvironmentView createEnvironmentView() {
return new EmptyEnvironmentView();
}
/**
* Factory method, responsible for creating the frame. This implementation
* shows how the {@code AgentAppFrame} can be configured with respect to the
* needs of the application even without creating a subclass.
*/
public AgentAppFrame createFrame() {
AgentAppFrame result = new AgentAppFrame();
result.setTitle("Demo Agent Application");
result.setSelectors(new String[] { "XSelect", "YSelect" },
new String[] { "Select X", "Select Y" });
result.setSelectorItems("XSelect", new String[] { "X1 (Small)",
"X2 (Large)" }, 1);
result.setSelectorItems("YSelect",
new String[] { "Y=1", "Y=2", "Y=3" }, 0);
result.setSplitPaneResizeWeight(0.5); // puts split bar in center
result.setSize(600, 400);
return result;
}
/** Factory method, responsible for creating the controller. */
public AgentAppController createController() {
return new DemoController();
}
// ///////////////////////////////////////////////////////////////
// main method for testing
/**
* Starts a simple test frame application.
*/
public static void main(String args[]) {
new SimpleAgentApp().startApplication();
}
}