1

このスレッドで説明されているように、カスタムCellTableヘッダーを作成しました: SearchBoxとFocusProblemを含むカスタムヘッダーを持つCellTable

フォーカスの問題を回避するには、keyupイベントの代わりにchangeイベントを使用してフィルタリングをトリガーするため、フィルターボックスがフォーカスを失うか、Enterキーが押された場合にのみフィルターがトリガーされるようになりました。

私が遭遇した唯一の問題は、フィルターボックスがスペースを受け入れないことです(keycode = 32)。これを経験している人はいますか?

4

4 に答える 4

2

CellTableの親クラスの1つであるAbstractHasDataクラスは、テーブルナビゲーションにSPACE、HOME、END、ARROW UP、およびARROW DOWNを使用するため、これらのキーがセルでデフォルトの機能を実行できないことがわかりました。

キーボードナビゲーションは、cellIsEditingがTRUEの場合にのみ抑制されます。これは、テーブルの本体のセルにフォーカスがあり、編集モードの場合にのみ発生します。

残念ながら、CellTableは元々ヘッダーの入力ボックスをサポートしていないため、ヘッダーのcellIsEditingもサポートされていません。

回避策として、CellTableクラスの独自の拡張機能でプライベートフィールドheaderIsEditingを作成しました。これは、デフォルトでFALSEに設定されています。次に、onBrowserEvent2メソッドをオーバーライドして、フィルター入力ボックスにフォーカスがある場合はheaderIsEditingをTRUEに設定し、同じボックスのブラーイベントが発生した場合はFALSEに設定しました。

次に、以下に示すようにisKeyboardNavigationSuppressedをオーバーライドしました。

@Override
protected boolean isKeyboardNavigationSuppressed() {
    return super.isKeyboardNavigationSuppressed() || headerIsEditing;
}

これにより、cellIsEditingがTRUEの場合、またはheaderIsEditingがTRUEの場合、キーボードナビゲーションが抑制されます。

于 2012-05-04T01:51:11.760 に答える
0

のオブジェクトには、 com.google.gwt.event.dom.client.DomEventクラスKeyUpEventのメソッドがありますgetNativeEvent()

それを使用すると、問題はないはずです。

if (event.getNativeEvent().getKeyCode() == 32) { 
       // TODO
}  

他の場所での原因と思われます。

于 2012-05-02T07:47:43.300 に答える
0

Andreyが指摘したブラウザイベントで、この問題の回避策を作成することができました。次のコードがありました。

public void onBrowserEvent(Context context, Element parent, C value,
    NativeEvent event, ValueUpdater<C> valueUpdater) {
if (value == null) return;

String eventType = event.getType();

GWT.log(eventType);

super.onBrowserEvent(context, parent, value, event, valueUpdater);

InputElement input = getInputElement(parent);

if ("change".equals(eventType)) {
    ((HeaderFilterDto) value).setFilterValue(input.getValue());
    if (valueUpdater != null) valueUpdater.update(value);
} else if ("keyup".equals(eventType) && event.getKeyCode() == 32) {
    insertSpaceToCursorPosition(input);
}
};

そして、カーソル位置にスペースを挿入する次のメソッドがあります。

protected void insertSpaceToCursorPosition(InputElement input) {
if (StringUtils.isNotBlank(input.getValue())) {
    int length = input.getValue().length();
    int pos = getCursorPos(input);
    int selected = getSelectionLength(input);

    String sub1 = input.getValue().substring(0, pos);
    String sub2 = input.getValue().substring(selected == 0 ? pos: pos + selected, length);

    input.setValue(sub1 + SPACE + sub2);

    setSelectionRange(input, pos);
} else {
    input.setValue(SPACE);
    setSelectionRange(input, 0);
}
}

insertSpaceToCursorPosition内のメソッドは、TextBoxImpl.classのValueBoxBase実装からパターン化されました。

于 2012-05-03T02:25:30.693 に答える
0

KeyProviderに渡されたものを修正して、この問題を解決しましたCellTable

KeyProviderこの問題は、nullのフィールドに基づいて実装されている場合に発生する可能性があります。このフィールドをcom.google.gwt.cell.client.AbstractInputCell#isEditing返すfalseと、SPACEBARキーがナビゲーションセルとして使用されます。

于 2015-10-28T13:36:40.573 に答える