package jas2.util;
import java.util.*;
import java.lang.reflect.*;

import javax.swing.*;
import javax.swing.event.*;

public class JTextFieldBinding extends FieldBinding implements DocumentListener
{
	protected JTextFieldBinding(JTextField field, byte flags)
	{
		this(field);
		m_flags = flags;
	}
	protected JTextFieldBinding(JTextField field)
	{
		m_field = field;
		field.getDocument().addDocumentListener(this);
	}
	void set(Object value)
	{
		String x = setValue(value);
		if (!m_oldVal.equals(x))
		{
			m_field.setText(x);
			m_oldVal = x;
		}
	}
	protected String setValue(Object value)
	{
		String x;
		if (value == null) x = "";
		else if (value instanceof String) x = (String) value;
		else x = value.toString();
		return x;
	}
	protected Object getValue(String value, Class type) throws UnsupportedType
	{
		if (type.isPrimitive())
		{
			if (type == Double.TYPE ) return new Double(value);
			if (type == Integer.TYPE) return new Integer(value); 
			throw new UnsupportedType(m_field,type);
		}
		else
		{
			Class[] strarg = { value.getClass() };
			try
			{
				Constructor c = type.getConstructor(strarg);
				Object[] args = { value };
				return c.newInstance(args);
			}
			catch (Exception xx)
			{
				throw new UnsupportedType(m_field,type);
			}
		}
	}
	Object get(Class type) throws UnsupportedType
	{
		return getValue(m_field.getText(),type);
	}
	public void changedUpdate(DocumentEvent e) { update(); } 
	public void insertUpdate(DocumentEvent e) { update(); } 
	public void removeUpdate(DocumentEvent e) { update(); } 
	private void update()
	{
		String x = m_field.getText();
		if (!x.equals(m_oldVal)) setChanged();
		notifyObservers();
	}
	protected void reset()
	{
		super.reset();
		m_oldVal = m_field.getText();
	}
	boolean hasValidInput()
	{
		final String value = m_field.getText();
		if ((m_flags & MUST_BE_NUMBER) != 0)
		{
			try
			{
				double d = (m_flags & MUST_BE_INTEGER_FLAG) != 0 ? (double) Integer.parseInt(value) : Double.valueOf(value).doubleValue();
				if ((m_flags & MUST_BE_POSITIVE) != 0 && d <= 0.0)
				{
					JOptionPane.showMessageDialog(m_field,
						value.concat(" is invalid input; value must be positive."),
						"Error", JOptionPane.ERROR_MESSAGE);
					return false;
				}
			}
			catch (NumberFormatException e)
			{
				JOptionPane.showMessageDialog(m_field,
					value +" is invalid input; value must be a"+
					((m_flags & MUST_BE_INTEGER) != 0 ? "n integer." : " number."),
					"Error", JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		return true;
	}
	private String m_oldVal = "";
	private JTextField m_field;
	private byte m_flags = 0;
	public static final byte MUST_BE_NUMBER = 1;
	private static final byte MUST_BE_INTEGER_FLAG = 2;
	public static final byte MUST_BE_INTEGER = MUST_BE_INTEGER_FLAG | MUST_BE_NUMBER;
	public static final byte MUST_BE_POSITIVE = 4;
}

 

Ads help maintain this website.