がありCellTable
、キーボード選択ポリシーを に設定したいと考えていKeyboardSelectionPolicy.BOUND_TO_SELECTION
ます。ただし、最初の行の aTextCell
を最初にクリックしても、期待どおりに行が完全に選択されないようです。説明のために、これは次のようになります
:
以降のすべてのクリックは、キーボード ナビゲーションと同様に、期待どおりに行を選択します。さらに、最初のクリックがNumberCell
、またはTextCell
他の行の である場合、選択は期待どおりに機能します。TextCell
この問題は、最初の行のa を最初にクリックしたときにのみ現れます。
再現するには、次のサンプル コードを検討してください。
public class WebApp implements EntryPoint {
private static class Model {
private final int num;
private final String name;
public Model(String name, int num) {
super();
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public int getNum() {
return num;
}
}
@Override
public void onModuleLoad() {
final CellTable<Model> table = new CellTable<Model>();
table.setWidth("100%", true); // Truncate cell contents as needed.
// Causes bug on first row first click TextCell selection.
table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
// Add a column to show the name.
TextCell textCell = new TextCell() {
@Override
public Set<String> getConsumedEvents() {
return Sets.newHashSet(BrowserEvents.CLICK);
}
};
Column<Model, String> termColumn = new Column<Model, String>(new TextCell()) {
@Override
public String getValue(Model entry) {
return entry.getName();
}
};
termColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
table.addColumn(termColumn);
// Add a column to show the num.
Column<Model, Number> numberColumn = new Column<Model, Number>(new NumberCell()) {
@Override
public Number getValue(Model object) {
return object.getNum();
}
};
numberColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
table.addColumn(numberColumn);
// Add a selection model to handle user selection.
final SingleSelectionModel<Model> selectionModel = new SingleSelectionModel<Model>();
table.setSelectionModel(selectionModel);
// Data.
ArrayList<Model> entries = buildEntries();
// Set the total row count. This isn't strictly necessary, but it affects
// paging calculations, so its good habit to keep the row count up to date.
table.setRowCount(entries.size(), true);
// Push the data into the widget.
table.setRowData(0, entries);
// Add it to the root panel.
RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
rootLayoutPanel.getElement().getStyle().setWidth(50, Unit.PCT);
rootLayoutPanel.getElement().getStyle().setHeight(50, Unit.PCT);
rootLayoutPanel.getElement().getStyle().setProperty("margin", "auto");
rootLayoutPanel.add(table);
}
private ArrayList<Model> buildEntries() {
ArrayList<Model> l = Lists.newArrayList();
for (int i = 0; i < 10; ++i) {
l.add(buildEntry());
}
return l;
}
private int currNum = 0;
private char currChar = 'a' - 1;
private Model buildEntry() {
int num = currNum++;
String term = Character.toString(++currChar);
for (int i = 0; i < 25; i++) {
term += currChar;
}
return new Model(term, num);
}
}
これは、Chrome、FF、IE で発生します。どんな助けでも大歓迎です、ありがとう。