|
The Model-View-Controller Pattern
An Introduction with Examples in Java |
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
Handling an arrowkeyPressed Event
Handling a mouseUp Event
Handling a characterKeyPressed Event
IntegerEntryField
String
can be converted
IntegerDocument
package mvc;
import javax.swing.text.*;
/**
* A Document that can only contain integer values
*
* Note: In order to be simple and clear, this implementation
* does not support numbers with a leading '+' and will not allow
* the document to contain only a '-'.
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class IntegerDocument extends PlainDocument
{
/**
* Check to see if an insertString() will result in an Integer or
* not.
*
* @param offset The starting offset
* @param text The string to insert
* @return true if OK; false otherwise
*/
public boolean checkInsert(int offset, String text)
{
boolean result;
String newText;
try
{
newText = super.getText(0, offset) + text +
super.getText(offset, getLength()-offset);
Integer.parseInt(newText);
result = true;
}
catch (Exception e)
{
result = false;
}
return result;
}
/**
* Check to see if a remove() will result in an Integer or not.
*
* @param offset The starting offset
* @param length The length to remove
* @return true if OK; false otherwise
*/
public boolean checkRemove(int offset, int remove)
{
boolean result;
String newText;
try
{
newText = super.getText(0, offset) +
super.getText(offset+remove, getLength()-offset-remove);
if (!newText.equals("")) Integer.parseInt(newText);
result = true;
}
catch (Exception e)
{
result = false;
}
return result;
}
/**
* Check to see if a replace() will result in an Integer or
* not.
*
* @param offset The starting offset
* @param length The length to remove
* @param text The string to insert
* @return true if OK; false otherwise
*/
public boolean checkReplace(int offset, int remove, String text)
{
boolean result;
String newText;
try
{
newText = super.getText(0, offset) + text +
super.getText(offset+remove, getLength()-offset-remove);
if (!newText.equals("")) Integer.parseInt(newText);
result = true;
}
catch (Exception e)
{
result = false;
}
return result;
}
/**
* Inserts content into the document (but only if
* the result is an Integer)
*
* @param offset The starting offset
* @param text The string to insert
* @param a The attributes for the inserted text
*/
public void insertString(int offset, String text, AttributeSet a)
throws BadLocationException
{
if (checkInsert(offset, text)) super.insertString(offset, text, a);
}
/*
* Remove some content from the document (but only if the result is
* a SimpleTime).
*
* @param offset The starting offset
* @param length The number of characters to remove
*/
public void remove(int offset, int length)
throws BadLocationException
{
if (checkRemove(offset, length)) super.remove(offset, length);
}
/**
* Deletes the region of text from offset to offset + length, and
* replaces it with text.
*
* @param offset The starting offset
* @param length The number of characters to remove
* @param text The string to insert
* @param a The attributes for the inserted text
*/
public void replace(int offset, int length, String text, AttributeSet a)
throws BadLocationException
{
if (checkReplace(offset, length, text))
super.replace(offset, length, text, a);
}
}
IntegerEntryField
package mvc;
import javax.swing.*;
import javax.swing.text.*;
/**
* An entry field that only accepts integers
*
* Note: In order to be simple and clear, this implementation
* does not support numbers with a leading '+' and will not allow
* the document to contain only a '-'.
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class IntegerEntryField extends JTextField
{
/**
* Create a Document (i.e., model) for this IntegerEntryField
*
* @return An IntegerDocument
*/
protected Document createDefaultModel()
{
return new IntegerDocument();
}
}
IntegerDocument:
IntegerDocument:
package lookandfeel;
import java.awt.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.*;
import gui.*;
/**
* An example that illustrates the use of the
* pluggable look-and-feel feature
*
* @version 1.0
* @author Prof. David Bernstein, James Madison University
*/
public class PLAFdemo
{
/**
* The entry point
*/
public static void main(String[] args)
{
BufferedReader in;
CloseableFrame f;
Container contentPane;
int i;
JListEditor jle;
String choice, systemPLAF;
UIManager.LookAndFeelInfo[] info;
f = new CloseableFrame();
contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());
jle = new JListEditor();
contentPane.add(jle, BorderLayout.CENTER);
f.setSize(400,300);
f.setVisible(true);
// To use the system look and feel
//try
//{
// lookAndFeel = UIManager.getSystemLookAndFeelClassName();
// UIManager.setLookAndFeel(lookAndFeel);
//}
//catch (Exception e)
//{
// // Use the default look and feel
//}
// Add two new views
// Note: The .jar files need to be in the classpath
try {
UIManager.setLookAndFeel(new com.incors.plaf.kunststoff.KunststoffLookAndFeel());
UIManager.setLookAndFeel(new net.sourceforge.mlf.metouia.MetouiaLookAndFeel());
} catch (Exception e) {
e.printStackTrace();
}
// Get all of the views
info = UIManager.getInstalledLookAndFeels();
// Print the views
info = UIManager.getInstalledLookAndFeels();
for (i=0; i < info.length; i++) {
System.out.println(i+"\t"+info[i].getClassName());
}
// Allow the user to change the views
in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
System.out.print("Number? ");
choice = in.readLine();
i = Integer.parseInt(choice);
UIManager.setLookAndFeel(info[i].getClassName());
SwingUtilities.updateComponentTreeUI(f);
//f.pack();
} catch (NumberFormatException nfe) {
System.exit(9);
} catch (IOException ioe) {
// Ignore
} catch (ClassNotFoundException cnfe) {
System.out.println("Couldn't set look and feel");
} catch (InstantiationException ie) {
System.out.println("Couldn't set look and feel");
} catch (IllegalAccessException ie) {
System.out.println("Couldn't set look and feel");
} catch (UnsupportedLookAndFeelException ie) {
System.out.println("Couldn't set look and feel");
}
}
}
}