问题描述
我有一个带有多行表的SWT程序,我是通过code意识到的,我是在网上用SWT.MeasureItem和SWT.PaintItem / EraseItem侦听器找到的。
到目前为止,代码工作正常,我得到了multine表。 我还需要对表进行排序,这是我使用比较器完成的。
但是现在出现了一个新问题,当我对列进行排序时,重新绘制了表格,必须再次调用多行表格的代码。 Everythig可以正常工作,但是每次对列进行排序时,它都会变得越来越模糊。
由于我找不到将列标题作为多行显示的方法,因此我只是将它们放在第一列中,并将bg设置为灰色。 TableColumns之前已定义。
多行:
public void modifyTable(String[] header,ArrayList<String[]> dataArr,int[] laengen,int checkswitch) {
Device device = Display.getCurrent();
Color grey = new Color(device,220,220);
dataArr.add(0,header);
for (int zeile = 0; zeile < dataArr.size(); zeile++) {
TableItem item = new TableItem(table,SWT.NONE);
for (int i2 = 0; i2 < header.length; i2++) {
item.setText(i2,dataArr.get(zeile)[i2]);
item.setFont(SWTResourceManager.getFont("Arial",10,SWT.NORMAL));
}
if (zeile == 0) {
item.setBackground(grey);
}
}
}
int TEXT_MARGIN = 2;
table.addListener(SWT.MeasureItem,new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
Point size = event.gc.textExtent(text);
event.width = size.x + 2 * TEXT_MARGIN;
event.height = Math.max(event.height,size.y + TEXT_MARGIN);
}
});
table.addListener(SWT.EraseItem,new Listener() {
public void handleEvent(Event event) {
event.detail &= ~SWT.FOREGROUND;
}
});
table.addListener(SWT.PaintItem,new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
int yOffset = 0;
if (event.index == 1) {
Point size = event.gc.textExtent(text);
yOffset = Math.max(0,(event.height - size.y) / 2);
}
event.gc.drawText(text,event.x + TEXT_MARGIN,event.y +
yOffset,true);
}
});
}
}
此代码可以正常工作。 如果单击“项目”,则该列将通过鼠标侦听器确定
table.addListener(SWT.MouseDown,new Listener() {
public void handleEvent(Event event) {
int clickedCloumn = 0;
Point pt = new Point(event.x,event.y);
TableItem item = tableGespDaten.getItem(pt);
if (item != null) {
for (int col = 0; col < tableGespDaten.getColumnCount();
col++) {
Rectangle rect = item.getBounds(col);
if (rect.contains(pt)) {
clickedCloumn = col;
}
}
}
根据所单击的列,将调用比较器。 带有对象的ArrayList将被排序(这也很好用)。 再次调用Modifytable。
table.removeAll();
updateTable(arrList);
我的猜测是问题不是排序的一部分,而是一遍又一遍地重绘表格,但是由于我在不知道为什么之前就清除了它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)