This package contains a collection of data aware components for use in building applications around the PJODe and PJODe C/S ODBMS systems. All components store their state and values automatically with no user intervention required. They can also be provided additional functionality by the programmer without affecting their data awareness.

The heart of the package is the {@link com.linxpda.dbaware.awt.DBRootPanel DBRootPanel} which should act as the parent to all other {@link com.linxpda.dbaware.DBAware DBAware} components. Any number of {@link com.linxpda.dbaware.awt.DBContainer DBContainer} objects can be placed within the {@link com.linxpda.dbaware.awt.DBRootPanel DBRootPanel} to create complex nested GUIs.

When adding a {@link com.linxpda.dbaware.DBAware DBAware} component (except DBContainer and DBRadiobox objects) to a {@link com.linxpda.dbaware.awt.DBRootPanel DBRootPanel} or {@link com.linxpda.dbaware.awt.DBContainer DBContainer}, be sure to call it's {@link com.linxpda.dbaware.DBAware#setColumnLabel(String) setColumnLabel} method to establish what value the component will hold. This value need not be meaningful, but should be unique to any other {@link com.linxpda.dbaware.DBAware DBAware} component within the {@link com.linxpda.dbaware.awt.DBRootPanel DBRootPanel}. Otherwise, the particular column in question will only contain the value from the last added component with that particular column label. {@link com.linxpda.dbaware.awt.DBContainer DBContainer} objects do not require a column label.

{@link com.linxpda.dbaware.awt.DBRadiobox DBRadiobox} components are handled a little differently. As multiple components will be used to hold state for only one column, you do not need to set a column label for them. Simply call the {@link com.linxpda.dbaware.DBAware#setColumnLabel(String) setColumnLabel} method for the {@link com.linxpda.dbaware.awt.DBRadioGroup DBRadioGroup} that is responsible for them.

Below is an example of a test file that stores email information for clients. This particular example uses the PJODe ODBMS, but could be changed to a client/server PJODe C/S version by changing only a single line of code.

import com.linxpda.dbaware.awt.*;
import java.awt.*;
import java.awt.event.*;

public class DBTest extends Frame {
	
	public static void main(String args[]) {
		if (args.length != 1) {
			System.out.println("USEAGE java DBTest ");
			System.exit(1);
		}
		else {
			new DBTest(args[0]);
		}
	}
	
	private DBRootPanel root;
	
	public DBTest(String filename) {
		try {
			// Setup the DBAware main panel first...
			root = new DBRootPanel();
			root.setFileName(filename);
			GridBagLayout g = new GridBagLayout();
			GridBagConstraints c = new GridBagConstraints();
			c.gridx = 0;
			c.gridy = 0;
			c.insets = new Insets(2, 2, 2, 2);
			c.anchor = c.WEST;
			root.setLayout(g);
			Label label = (Label) root.add(new Label("Name:"));
			g.setConstraints(label, c);
			DBTextField name = (DBTextField) root.add(new DBTextField(15));
			name.setColumnLabel("name");
			c.gridx++;
			c.gridwidth = 2;
			g.setConstraints(name, c);
			label = (Label) root.add(new Label("Email:"));
			c.gridx--;
			c.gridy++;
			c.gridwidth = 1;
			g.setConstraints(label, c);
			DBTextField email = (DBTextField) root.add(new DBTextField(15));
			email.setColumnLabel("email");
			c.gridx++;
			c.gridwidth = 2;
			g.setConstraints(email, c);
			DBRadioGroup group = new DBRadioGroup();
			group.setColumnLabel("friend");
			label = (Label) root.add(new Label("Friend:"));
			c.gridx--;
			c.gridy++;
			c.gridwidth = 1;
			g.setConstraints(label, c);
			DBRadiobox yes = (DBRadiobox) root.add(new DBRadiobox("Yes"));
			group.addRadiobox(yes);
			c.gridx++;
			g.setConstraints(yes, c);
			DBRadiobox no = (DBRadiobox) root.add(new DBRadiobox("No"));
			group.addRadiobox(no);
			c.gridx++;
			g.setConstraints(no, c);
			group.setDefault(yes);
			label = (Label) root.add(new Label("Access:"));
			c.gridx = 0;
			c.gridy++;
			g.setConstraints(label, c);
			DBCheckbox pop3 = (DBCheckbox) root.add(new DBCheckbox("POP3"));
			pop3.setColumnLabel("http");
			c.gridx++;
			g.setConstraints(pop3, c);
			DBCheckbox imap = (DBCheckbox) root.add(new DBCheckbox("IMAP"));
			imap.setColumnLabel("imap");
			c.gridx++;
			g.setConstraints(imap, c);
			label = (Label) root.add(new Label("Notes:"));
			c.gridx = 0;
			c.gridy++;
			g.setConstraints(label, c);
			DBTextArea notes = (DBTextArea) root.add(new DBTextArea(3, 15));
			notes.setColumnLabel("notes");
			c.gridx++;
			c.gridwidth = 2;
			g.setConstraints(notes, c);
			c.gridx = 0;
			c.gridy++;
			c.gridwidth = 1;
			label = (Label) root.add(new Label("State:"));
			g.setConstraints(label, c);
			DBChoice choice = (DBChoice) root.add(new DBChoice());
			choice.setColumnLabel("state");
			choice.add("MD");
			choice.add("NJ");
			choice.add("DE");
			c.gridx++;
			c.gridwidth = 2;
			g.setConstraints(choice, c);
			setLayout(new BorderLayout());
			add(root, BorderLayout.CENTER);
			
			// Now make a navigation panel...
			Panel panel = new Panel(new FlowLayout());
			Button first = (Button) panel.add(new Button("<<"));
			first.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.showFirstEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button previous = (Button) panel.add(new Button("<"));
			previous.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.showPreviousEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button next = (Button) panel.add(new Button(">"));
			next.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.showNextEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button last = (Button) panel.add(new Button(">>"));
			last.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.showLastEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button add = (Button) panel.add(new Button("+"));
			add.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.addEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button delete = (Button) panel.add(new Button("X"));
			delete.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.deleteEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button update = (Button) panel.add(new Button("^"));
			update.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.updateEntry();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button clear = (Button) panel.add(new Button("Clear"));
			clear.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.reset();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			Button search = (Button) panel.add(new Button("?"));
			search.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						root.search();
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			add(panel, BorderLayout.SOUTH);
			
			// Connect the database...
			root.connect();
			
			// Pack and display...
			pack();
			addWindowListener(new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					try {
						setVisible(false);
						root.close();
						dispose();
						System.exit(1);
					}
					catch(Exception ex) {
						reportException(ex);
					}
				}
			});
			setVisible(true);
		}
		catch(Exception ex) {
			ex.printStackTrace();
			System.exit(1);
		}
	}
	
	public void reportException(Exception ex) {
		ex.printStackTrace();
	}
}

As you can see, with the exception of the {@link com.linxpda.dbaware.DBAware#setColumnLabel(String) setColumnLabel} method call requirement, programming a database application using our DBAware package is virtually no different then programming any other GUI interface.