一、效果
将输入过的值保存在临时文件中,当重新输入时可以根据已经输入的文字进行匹配显示。
二、使用
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()
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属性。
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();
}
}