So, who wants spell check. Well, I did and here's how, in case anyone is interested. Also, I have no affiliation with any of these projects if anyone cares about that either.

First download JOrtho from here: http://sourceforge.net/projects/jortho/

JOrtho works with any language you can provide a dictionary for. Looks like wiktionary has dozens of langauges available. So this should work well for tons of people.

Now you can add the jortho.jar and your chosen dictionary/s to your project. I created a /dictionaries directory in my Resource Packages along side my /images, /ctx, etc.

Create your dictionary:

The dictionaries are based on the Wiktionary dictionaries. This is a step by step description how you can generate a new dictionary version.

1. Download the data from Wiktionary. The file for the English language is http://download.wikimedia.org/enwikt...ticles.xml.bz2 Replace the two letters language code (en in this case) before wiktionary (2 places) with your language. Some languages also require the data of the English Wiktionary (currently Polish and Arabic)
2. Extract the XML file from the archive
3. Download or check out the sources of JOrtho and compile it.
4. Execute the command
java -Xmx256M com.inet.jorthodictionaries.BookGenerator en <wiktionary folder>
Replace the "en" with your language.

Then I dropped the dictionary file in my /dictionaries directory. And created a dictionaries.properties file to specify what languages I have provided dictionaries for that for me looks like this:

Code:
# dictionaries.properties
# 
# Created on Dec 8, 2010, 2:29:47 PM
# 
# To change this template, choose Tools | Templates
# and open the template in the editor.

languages=en
Just add your list of comma separated language code you wan't to provide spell checking for in place of the en.

Now for the fun part, you can create an interceptor factory and interceptor to automatically add spell check to all your text components like this:

Note: I created my own AbstractTextComponentInterceptor, as the default one doesn't work right.

Code:
/*
 * Copyright 2002-2007 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.chd.hydra.form.interceptor;

import javax.swing.JComponent;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
import org.springframework.binding.form.FormModel;
import org.springframework.richclient.form.builder.support.AbstractFormComponentInterceptor;

/**
 * A <code>AbstractTextComponentInterceptor</code> is an abstract base class for
 * FormComponentInterceptors that work on JTextComponents.
 * 
 * @author Peter De Bruycker
 * @author aarmistead
 */
public abstract class AbstractTextComponentInterceptor extends AbstractFormComponentInterceptor {

  /**
   * Creates a new instance of <code>AbstractTextComponentInterceptor</code> with no form model.
   */
  public AbstractTextComponentInterceptor() {
    super();
  }
  
  /**
   * Creates a new instance of <code>AbstractTextComponentInterceptor</code> with the specified
   * <code>formModel</code>.
   * 
   * @param formModel The form model for this form component interceptor.
   */
  public AbstractTextComponentInterceptor(FormModel formModel) {
    super(formModel);
  }

  /**
   * Process the specified <code>component</code> by getting an appropriate text component
   * from it and processing the text component.
   *
   * @param propertyName The property name for which to process a component.
   * @param component The component to process.
   */
  @Override
  public final void processComponent(String propertyName, JComponent component) {
    JTextComponent textComponent = getTextComponent(getInnerComponent(component));
    if(textComponent != null) {
      processComponent(propertyName, textComponent);
    }
  }

  /**
   * Process the specified <code>textComponent</code> with the specified
   * <code>propertyName</code>.
   *
   * @param propertyName The name of the property with which to process a component.
   * @param textComponent The text component to process.
   */
  protected abstract void processComponent(String propertyName, JTextComponent textComponent);

  /**
   * Converts the given component to a <code>JTextComponent</code>. This can be a
   * simple cast if the component is already a text component, or an embedded component
   * (for example a JSpinner).
   * <p>
   * This method is protected, and can be overridden when necessary.
   *
   * @param component The component from which to get a text component.
   * @return a <code>JTextComponent</code>, or <code>null</code>
   */
  protected JTextComponent getTextComponent(JComponent component) {
    if(component instanceof JTextComponent) {
      return (JTextComponent)component;
    }

    if(component instanceof JSpinner) {
      JSpinner spinner = (JSpinner)component;
      if(spinner.getEditor() instanceof JSpinner.DefaultEditor) {
        return ((DefaultEditor)spinner.getEditor()).getTextField();
      }
      if(spinner.getEditor() instanceof JTextField) {
        return (JTextField)spinner.getEditor();
      }
    }

    return null;
  }

}