FormattedTextFieldRenderer.java

package edu.udel.cis.vsl.civl.gui.common;

import java.awt.Component;
import java.text.ParseException;

import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 * This renderer class is used to override the default behavior for rendering
 * numbers/Strings in a JTable. From a <code>JTextField</code> to a
 * <code>JFormattedTextField</code> with the appropriate format filters.
 * 
 * @author noyes
 * 
 */
public class FormattedTextFieldRenderer implements TableCellRenderer {

	/**
	 * Verifies whether an input is of the correct format(Number, String etc.)
	 * 
	 * @author StevenNoyes
	 *
	 */
	private class FormattedTextFieldVerifier extends InputVerifier {
		public boolean verify(JComponent input) {
			if (input instanceof JFormattedTextField) {
				JFormattedTextField ftf = (JFormattedTextField) input;
				AbstractFormatter formatter = ftf.getFormatter();
				if (formatter != null) {
					String text = ftf.getText();
					try {
						formatter.stringToValue(text);
						return true;
					} catch (ParseException pe) {
						return false;
					}
				}
			}
			return true;
		}

		public boolean shouldYieldFocus(JComponent input) {
			return verify(input);
		}
	}

	/**
	 * The text field associated with this Editor.
	 */
	private JFormattedTextField jftf;

	private String mode;

	/**
	 * The verifier associated with this Renderer
	 */
	// TODO: Make this actually work, there is somekind of bug that causes this
	// not to work very well.
	@SuppressWarnings("unused")
	private FormattedTextFieldVerifier verifier;

	public FormattedTextFieldRenderer() {
		super();
		verifier = new FormattedTextFieldVerifier();
		mode = "";
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		jftf = new JFormattedTextField(value);
		jftf.setFocusLostBehavior(JFormattedTextField.REVERT);

		// not this, though.
		check();
		return jftf;
	}

	public String getMode() {
		return mode;
	}

	public void setMode(String mode) {
		this.mode = mode;
		// verifier.verify(jftf);
		// checkMode();
	}

	// doesnt do anything yet
	public void check() {
		// verifier.verify(jftf);
	}

}