SWT/JFace アプリケーションで使用している Text ウィジェットのフィールド支援を作成しようとしています。
Text コンポーネントに ModifyListener を追加しました。これが ModifyEvent によってトリガーされると、ここの setAutoCompletion() メソッドと次のメソッドが呼び出されます。
問題は、少なくとも 2 文字を入力した後にのみ機能することです。つまり、候補として「387」がある場合、「3」を入力し、その後に「8」を入力する必要があります。ポップアップは、2 番目の「8」文字でのみ表示されます。
その後、常に期待どおりに機能しますが、テキストが初めてイベントを受け取ったときに機能しない理由がわかりません。「stackoverflow」と Google を調べましたが、何も見つかりませんでした。
private void setAutoCompletion(final Widget widget, final String value) {
try {
LOG.debug("Llamada desde " + widget.toString());
ContentProposalAdapter adapter = null;
final String[] proposals = getAllProposals(widget, value);
LOG.debug("Las sugerencias para el widget son: " + proposals);
for (final String s : proposals) {
LOG.debug(s);
}
final SimpleContentProposalProvider scp = new SimpleContentProposalProvider(proposals);
scp.setProposals(proposals);
scp.setFiltering(true);
if (widget instanceof Text) {
adapter = new ContentProposalAdapter((Text) widget, new TextContentAdapter(), scp, null, null);
} else {
adapter = new ContentProposalAdapter((Combo) widget, new ComboContentAdapter(), scp, null, null);
}
adapter.setEnabled(true);
adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
} catch (final Exception e) {
MessagePanel.openError(Display.getCurrent().getActiveShell(), GUITexts
.get(Labels.DESTOCK_PROPOSAL_ERROR_TITLE), GUITexts.get(Labels.DESTOCK_PROPOSAL_ERROR_TEXT));
}
}
private String[] getAllProposals(final Widget widget, final String text) {
List<String> proposals = new ArrayList<String>();
if (text == null || text.length() == 0) {
proposals = null;
} else {
if (widget instanceof Text) {
for (final Workorder wo : this.openWorkorders) {
if (wo.getWorkorderId().toString().startsWith(text)) {
proposals.add(wo.getWorkorderId().toString());
}
}
} else if (widget instanceof Combo) {
for (final Workorder wo : this.openWorkorders) {
if (wo.getDescription().startsWith(text)) {
proposals.add(wo.getDescription());
}
}
}
}
String[] result = null;
if (proposals != null) {
result = new String[proposals.size()];
for (int i = 0; i < result.length; i++) {
result[i] = proposals.get(i);
}
} else {
result = new String[0];
}
return result;
}