ScrollPanel にネストされた FlexTable でカスタマイズするために、DialogBox から拡張するクラスを作成しました。問題は、内部にダミー コードを含むスクロール ハンドラ (Window.alert....) があったとしても、イベントがスローされなかったかのように画面に何も表示されないことです。
これまでの私のコードは次のとおりです。
public class LogViewerPopup extends DialogBox {
private DashboardServiceInterfaceAsync myService;
private FlexTable innerTable;
private String tool;
private String version;
private String exec_id;
private String scenario;
private int xPos;
private int yPos;
public LogViewerPopup(DashboardServiceInterfaceAsync myService, String tool, String version, String exec_id, String scenario, int xPos, int yPos) {
super(true, false);
this.myService = myService;
this.tool = tool;
this.version = version;
this.exec_id = exec_id;
this.scenario = scenario;
this.xPos = xPos;
this.yPos = yPos;
this.setStyleName("dialog");
this.setStyleDependentName("dialogContent", true);
this.setAnimationEnabled(true);
this.setGlassEnabled(true);
this.setText(tool + " - " + scenario + " - " + version);
//this.setWidget(new Label(tool + " - " + scenario + " - " + version));
this.setPopupPosition(xPos, yPos);
myService.getLogs(version, tool, exec_id, scenario, new AsyncCallback<ArrayList<HashMap<String,String>>>() {
@Override
public void onSuccess(ArrayList<HashMap<String, String>> result) {
System.out.println("Debug !");
innerTable = new FlexTable();
innerTable.setCellSpacing(0);
ScrollPanel sp = new ScrollPanel();
sp.addScrollHandler(new ScrollHandler() {
@Override
public void onScroll(ScrollEvent event) {
Window.alert("Scrolling !");
}
});
//Headers
addColumn("ID");
addColumn("Date");
addColumn("Scenario");
addColumn("Module");
addColumn("Logtype");
addColumn("Content");
addColumn("Exec ID");
addColumn("Executor");
addColumn("Current Dataset");
addColumn("Total Datasets");
//Results
for(int i = 0 ; i < result.size() ; i++){
innerTable.setWidget(i + 1, 0, new Label(result.get(i).get("id")));
innerTable.setWidget(i + 1, 1, new Label(result.get(i).get("date")));
innerTable.setWidget(i + 1, 2, new Label(result.get(i).get("scenario")));
innerTable.setWidget(i + 1, 3, new Label(result.get(i).get("module")));
innerTable.setWidget(i + 1, 4, new Label(result.get(i).get("logtype")));
innerTable.setWidget(i + 1, 5, new Label(result.get(i).get("content")));
innerTable.setWidget(i + 1, 6, new Label(result.get(i).get("exec_id")));
innerTable.setWidget(i + 1, 7, new Label(result.get(i).get("executor")));
innerTable.setWidget(i + 1, 8, new Label(result.get(i).get("current_dataset")));
innerTable.setWidget(i + 1, 9, new Label(result.get(i).get("total_datasets")));
}
for(int i = 0 ; i < innerTable.getRowCount() ; i++)
for(int j = 0; j < innerTable.getCellCount(i) ; j ++)
innerTable.getCellFormatter().addStyleName(i,j,"FlexTable-Cell");
applyLineStyle();
sp.add(innerTable);
setWidget(sp);
show();
}
@Override
public void onFailure(Throwable caught) {
Window.alert("Error generating the LogViewerPopup : " + caught.getMessage());
}
});
}
private void applyLineStyle(){
HTMLTable.RowFormatter rf = innerTable.getRowFormatter();
for (int row = 1; row < innerTable.getRowCount(); ++row) {
if ((row % 2) != 0) {
rf.addStyleName(row, "FlexTable-OddRow");
}
else {
rf.addStyleName(row, "FlexTable-EvenRow");
}
}
rf.addStyleName(0, "FlexTable-HeaderRow");
}
private void addColumn(String text){
Label label = new Label(text);
label.setWidth("100%");
try{
innerTable.setWidget(0, innerTable.getCellCount(0), label);
}catch(IndexOutOfBoundsException e){
innerTable.setWidget(0, 0, label);
}
}
}
私は必死にこれを最終的に機能させようとしているので、構造の悪いコードに注意を払わないでください ;)
注:ScrollPanelをFocusPanel内にラップすることでスクロールをキャッチできましたが、スクロールバーがどこにあるかを正確に知りたいので、実際には役に立ちません。私はGWT 3.7を使用しています