我希望能够在 NatTable 单元格内呈现一些选择芯片。为此,我需要一个自定义单元格画家才能绘制小部件。不幸的是,我对 NatTable 画家不太有经验。当然,第一步是扩展抽象类 AbstractCellPainter,但不确定在 PaintCell 方法中做什么。 短暂性脑缺血发作。
我只尝试创建自定义单元格编辑器。在那里,它可以工作,但我希望它显示在 DisplayMode.NORMAL 上,而不是在编辑模式下。
实现 NatTable Painter 实际上非常简单。您只需使用 SWT
GC
进行绘制即可。有关这方面的一些信息可以在SWT Graphics 简介中找到
我不确定我的理解是否正确,因为我真的不知道“选择筹码”是什么。但我想你指的是单选按钮。例如,以下代码片段在单元格中呈现三个单选按钮,其中“活动”单选按钮移动每一行。
public class RadioButtonPainter extends AbstractCellPainter {
private int outerCircleDiameter = GUIHelper.convertHorizontalPixelToDpi(16);
private int innerCircleDiameter = GUIHelper.convertHorizontalPixelToDpi(10);
private int innerCirclePadding = GUIHelper.convertHorizontalPixelToDpi(3);
@Override
public void paintCell(ILayerCell cell, GC gc, Rectangle bounds, IConfigRegistry configRegistry) {
// set foreground color to black
Color previousForeground = gc.getForeground();
Color previousBackground = gc.getBackground();
gc.setForeground(GUIHelper.COLOR_BLACK);
gc.setBackground(GUIHelper.COLOR_BLACK);
int active = cell.getRowIndex() % 3;
int x = bounds.x + 5;
int y = bounds.y + 2;
gc.drawOval(x, y, this.outerCircleDiameter, this.outerCircleDiameter);
if (active == 0) {
int innerX = x + this.innerCirclePadding;
int innerY = y + this.innerCirclePadding;
gc.fillOval(innerX, innerY, this.innerCircleDiameter, this.innerCircleDiameter);
}
x += this.outerCircleDiameter + 5;
gc.drawOval(x, y, this.outerCircleDiameter, this.outerCircleDiameter);
if (active == 1) {
int innerX = x + this.innerCirclePadding;
int innerY = y + this.innerCirclePadding;
gc.fillOval(innerX, innerY, this.innerCircleDiameter, this.innerCircleDiameter);
}
x += this.outerCircleDiameter + 5;
gc.drawOval(x, y, this.outerCircleDiameter, this.outerCircleDiameter);
if (active == 2) {
int innerX = x + this.innerCirclePadding;
int innerY = y + this.innerCirclePadding;
gc.fillOval(innerX, innerY, this.innerCircleDiameter, this.innerCircleDiameter);
}
// reset GC
gc.setForeground(previousForeground);
gc.setBackground(previousBackground);
}
@Override
public int getPreferredWidth(ILayerCell cell, GC gc, IConfigRegistry configRegistry) {
return (this.outerCircleDiameter * 3) + 10 + 10;
}
@Override
public int getPreferredHeight(ILayerCell cell, GC gc, IConfigRegistry configRegistry) {
return this.outerCircleDiameter;
}
}
如上所述,这是一个非常简单的实现,可以手动绘制单选按钮。例如,您还可以使用图像,就像在
CheckBoxPainter
中所做的那样,来模拟更原生的外观和感觉。但是你当然需要创建相应的图像。
我实际上想知道编辑应该如何工作,因为单击可能无法以正确的方式激活您的自定义编辑器。我不确定你如何实现数据连接,画家如何知道哪个单选按钮处于活动状态。但事情变得更加复杂。这个问题只与实现画家有关。