文章出处:
http://blog.youkuaiyun.com/shrekmu/archive/2007/11/27/1904500.aspx
一、效果
将输入过的值保存在临时文件中,当重新输入时可以根据已经输入的文字进行匹配显示。
二、使用
//
生成控件
txtTheaterName
=
new
Text(cmpCondition, SWT.BORDER);
txtTheaterName.setBounds(
55
,
0
,
150
,
20
);
actTheaterName
=
new
DCAutoCompleteTextInput(txtTheaterName,
"
TheaterList.actTheaterName
"
);
//
在检索按钮的点击事件中添加新的输入文字
actTheaterName.registerText();
三、代码
DCAutoCompleteTextInput扩展swtaddons的AutocompleteTextInput,实现功能
1)、定义弹出框的大小
2)、当Text控件消除的时候,消除关联的ContentProvider。
3)、自动关联DCAutoCompleteContentProvider
4)、提供注册的新文字的接口registerText()
package jp.co.ntt.dc.framework.client.autocomplete;

import net.sf.swtaddons.autocomplete.AutocompleteContentProposalProvider;
import net.sf.swtaddons.autocomplete.text.AutocompleteTextInput;

import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Text;


/**/
/**
* <b>系统名称:</b>Digital Cinema心得--SWT学习与使用<br>
* <b>技能名称:</b>输入援助机能<br>
* <b>处理说明:</b>当再次输入时,如果和以前输入的值前端一致就会显示一个列表供选择。<br>
* <b>变更履历:</b>2007/10/16 MuChunYu Create<br>
* <br>
*
* @author Mu ChunYu
* @version 1.0 2007/07/04 初版
* <p>
*/

public
class
DCAutoCompleteTextInput extends AutocompleteTextInput
...
{


/**//**
* <b>機能概要:</b> 构造函数。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>親コンストラクタを呼び出す
* <li>入力援助のサイズを設定する
* <li>Disposeリスナーを追加する
* </ul>
*
* @param text 連れたテキストフィールド
* @param key 内容提供者のキー
* @since 1.0
* <p>
*/

public DCAutoCompleteTextInput(Text text, String key) ...{

super(text, new String[] ...{key});
this.adapter.setPopupSize(new Point(150, 100));

text.addDisposeListener(new DisposeListener() ...{

public void widgetDisposed(DisposeEvent e) ...{
dispose();
}
});
}


/**//**
* <b>機能概要:</b> 内容提供者を取得する。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>内容提供者を取得する
* </ul>
*
* @param proposals 内容
* @return DCAutoCompleteContentProvider 内容提供者
* @since 1.0
* <p>
*/
@Override

protected AutocompleteContentProposalProvider getContentProposalProvider(String[] proposals) ...{
return new DCAutoCompleteContentProvider(proposals[0]);
}


/**//**
* <b>機能概要:</b> 連れたテキストフィールドのテキストを取得する。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>連れたテキストフィールドのテキストを取得する
* </ul>
*
* @return String 連れたテキストフィールドのテキス
* @since 1.0
* <p>
*/

public String getText() ...{
return this.text.getText();
}


/**//**
* <b>機能概要:</b> dispose前の処理部。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>入力援助をdisposeする
* </ul>
*
* @since 1.0
* <p>
*/

public void dispose() ...{
((DCAutoCompleteContentProvider) this.provider).dispose();
}


/**//**
* <b>機能概要:</b> 入力援助内容を登録する。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>入力援助内容を登録する
* </ul>
*
* @since 1.0
* <p>
*/

public void registerText() ...{
((DCAutoCompleteContentProvider) this.provider).registerContent(getText());
}

}
DCAutoCompleteContentProvider扩展swtaddons的AutocompleteContentProposalProvider,实现功能
1)、根据key自动加载、保存援助的内容
2)、可配置的自动输入援助List的大小,默认大小为20
3)、可配置的自动输入援助文件的保存路径,默认为当前目录下的tmp目录
4)、可配置的自动输入援助文件的编码格式,默认为UTF-8
存在问题:代码中使用一个静态类,以提供可配置的List大小和保存路径
改进点:
1)、添加三个成员变量:
contentsSize:默认值20
encoding:默认值UTF-8
path:默认值./tmp
2)、删除已有的构造函数,添加一个有四个参数的构造函数
3)、添加一个DCAutoCompleteContentProviderFactory,其中提供可配置contentsSize,encoding,path
4)、 DCAutoCompleteTextInput添加一个DCAutoCompleteContentProviderFactory的属性,在生成 DCAutoCompleteContentProvider的时候,只向DCAutoCompleteContentProviderFactory提 供key属性。
package
jp.co.ntt.dc.framework.client.autocomplete;

import
java.io.File;
import
java.util.LinkedList;

import
jp.co.ntt.dc.framework.client.context.DCContext;
import
jp.co.ntt.dc.framework.common.MessageKeys;
import
jp.co.ntt.dc.framework.common.log.Logger;
import
net.sf.swtaddons.autocomplete.AutocompleteContentProposalProvider;

import
org.apache.commons.io.FileUtils;
import
org.apache.commons.lang.StringUtils;


/** */
/**
* <b>サブシステム名:</b>デジタルシネマ クライアントのフレームワーク<br>
* <b>機能名称:</b>自動入力援助機能<br>
* <b>処理説明:</b>自動入力援助の内容を提供するクラス。<br>
* <b>変更履歴:</b>2007/06/14 NTT-AT 新規<br>
* <br>
*
* @author NTT-AT
* @since 1.0
* @version 1.0 2007/06/14 初版
* <p>
*/

public
class
DCAutoCompleteContentProvider
extends
AutocompleteContentProposalProvider
...
{


/** *//** エンコーディング:UTF-8 */
private static final String ENCODING = "utf-8";


/** *//** ログ */
private Logger logger = new Logger(getClass());


/** *//** 内容リスト */
private LinkedList <String> contents = new LinkedList <String>();


/** *//** 提供者のキー */
private String key = null;


/** *//**
* <b>機能概要:</b> コンストラクタ。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>親コンストラクタを呼び出す
* <li>内容ファイルをロードする
* <li>自動入力援助内容をリフレッシュする
* </ul>
*
* @param key 内容提供者のキー
* @since 1.0
* <p>
*/

public DCAutoCompleteContentProvider(String key) ...{
super(null);
this.key = key;
load();
refreshProposals();
}


/** *//**
* <b>機能概要:</b> 入力援助内容を登録する。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>最後の空白は削除する
* <li>空ストリングなら、登録しなし
* <li>保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する
* <li>登録アイテムが存在した場合、先頭に移動する
* <li>アイテムを先頭に追加する
* </ul>
* @param proposal 入力援助
* @since 1.0
* <p>
*/

public void registerContent(String proposal) ...{

String value = org.springframework.util.StringUtils.trimTrailingWhitespace(proposal);

// 空ストリングなら、登録しなし

if (StringUtils.isEmpty(value)) ...{
return;
}

// 保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する

while (this.contents.size() >= DCContext.getAutoListMaxSize()) ...{
this.contents.removeLast();
}

// 登録アイテムが存在した場合、先頭に移動する

if (this.contents.contains(value)) ...{
this.contents.remove(value);
}

// アイテムを先頭に追加する
this.contents.addFirst(value);

// リストデータをレフレッシュする
refreshProposals();
}



/** *//**
* <b>機能概要:</b> 入力援助をリフレッシュする。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>入力援助をリフレッシュする
* </ul>
*
* @since 1.0
* <p>
*/

private void refreshProposals() ...{
this.proposals = this.contents.toArray(new String[0]);
}


/** *//**
* <b>機能概要:</b> 内容ファイルをロードする。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>内容ファイルをロードする
* </ul>
*
* @since 1.0
* <p>
*/

private void load() ...{
String filePath = DCContext.getAutoCompletePath() + this.key;
File file = new File(filePath);

if (!file.exists()) ...{
return;
}


try ...{
this.contents.addAll(FileUtils.readLines(file, ENCODING));

} catch (Exception e) ...{

this.logger.warn(MessageKeys.M00_00570, new String[] ...{filePath});
this.logger.debug(MessageKeys.M00_00570, e);
}

// 保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する

while (this.contents.size() > DCContext.getAutoListMaxSize()) ...{
this.contents.removeLast();
}
}


/** *//**
* <b>機能概要:</b> 内容ファイルを保存する。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>内容ファイルを保存する
* </ul>
*
* @since 1.0
* <p>
*/

private void save() ...{
String filePath = DCContext.getAutoCompletePath() + this.key;
File file = new File(filePath);

try ...{

if (!file.exists()) ...{
FileUtils.forceMkdir(new File(DCContext.getAutoCompletePath()));
}
FileUtils.writeLines(file, ENCODING, this.contents);

} catch (Exception e) ...{

this.logger.warn(MessageKeys.M00_00571, new String[] ...{filePath});
this.logger.debug(MessageKeys.M00_00571, e);
}
}


/** *//**
* <b>機能概要:</b> dispose前の処理部。<br>
* <br>
* <b>処理詳細:</b> <br>
* <ul>
* <li>内容ファイルを保存する
* </ul>
*
* @since 1.0
* <p>
*/

public void dispose() ...{
save();
}
}