NatTable 定制 Cell Painter 选择芯片

问题描述 投票:0回答:1

我希望能够在 NatTable 单元格内呈现一些选择芯片。为此,我需要一个自定义单元格画家才能绘制小部件。不幸的是,我对 NatTable 画家不太有经验。当然,第一步是扩展抽象类 AbstractCellPainter,但不确定在 PaintCell 方法中做什么。 短暂性脑缺血发作。

我只尝试创建自定义单元格编辑器。在那里,它可以工作,但我希望它显示在 DisplayMode.NORMAL 上,而不是在编辑模式下。

java swt nattable nebula
1个回答
0
投票

实现 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
中所做的那样,来模拟更原生的外观和感觉。但是你当然需要创建相应的图像。

我实际上想知道编辑应该如何工作,因为单击可能无法以正确的方式激活您的自定义编辑器。我不确定你如何实现数据连接,画家如何知道哪个单选按钮处于活动状态。但事情变得更加复杂。这个问题只与实现画家有关。

© www.soinside.com 2019 - 2024. All rights reserved.