テキスト内の単語の頻度を示すバーを含むテーブルを作成しました。ユーザーがクリックした特別な単語の数、またはテキスト内の単語全体の頻度を示します。リストのリストを取得し、fill table 関数に送信します。すべて問題ありませんが、特別な単語を選択してからクリックして単語全体を表示すると、indexoutofbounds 例外が発生します。データソースを変更したためだと思います。それは本当に奇妙ですが、単純です。しかし、私はそれを解決することができませんでした。
public void fill_count_table(List<RootWordSet> source){
final List<RootWordSet> mysource=source;
if(source!=null){
for(int i=0;i<source.size();i++){
TableItem ti=new TableItem(count_table, SWT.NONE);
ti.setText(source.get(i).getRoot());
}
count_table.addListener(SWT.PaintItem, new Listener() {
public void handleEvent(Event event) {
if (event.index == 1) {
try{
GC gc = event.gc;
TableItem item = (TableItem)event.item;
int index = count_table.indexOf(item);
System.out.println(mysource.size());
int percent = mysource.get(index).getWordNumber();
org.eclipse.swt.graphics.Color foreground = gc.getForeground();
org.eclipse.swt.graphics.Color background = gc.getBackground();
gc.setForeground(Display_1.getSystemColor(SWT.COLOR_BLUE));
gc.setBackground(Display_1.getSystemColor(SWT.COLOR_DARK_BLUE));
int width = (tc2.getWidth() - 1) * percent / 100;
gc.fillGradientRectangle(event.x, event.y, width, event.height, true);
Rectangle rect2 = new Rectangle(event.x, event.y, width-1, event.height-1);
gc.drawRectangle(rect2);
gc.setForeground(Display_1.getSystemColor(SWT.COLOR_RED));
String text = Integer.toString(percent) ;
Point size = event.gc.textExtent(text);
int offset = Math.max(0, (event.height - size.y) / 2);
gc.drawText(text, event.x+2, event.y+offset, true);
gc.setForeground(background);
gc.setBackground(foreground);
}
catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
});
}
else{
count_table.removeAll();
count_table.redraw();
}
}
これはエラーを起こす行です: int percent = mysource.get(index).getWordNumber(); データソースを変更するとどうなるか本当にわかりません。お互いにシフトすると固まりました。データソースのサイズを確認するためにprintlnを入れても、2つのサイズがあるのは非常に奇妙でした。1 つは以前のデータソースに属し、もう 1 つは newwr に属します。とにかく、このグラフィックパーツテーブルを削除すると、正しく塗りつぶされます。どう思いますか?