java - 在 TableCellRenderer 中使用自定义 Swing JComponent

标签 java swing jcomponent tablecellrenderer

好的,我知道如何制作一个简单的自定义 JComponent。我知道如何重写 TableCellRenderer。我似乎无法将两者结合起来。

这是我创建的示例JComponent:

public static class BarRenderer extends JComponent
{
    final private double xmin;
    final private double xmax;
    private double xval;
    public BarRenderer(double xmin, double xmax)
    {
        this.xmin=xmin;
        this.xmax=xmax;
    }

    @Override protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Rectangle r = g.getClipBounds();
        g.drawRect(r.x, r.y,
                (int)(r.width * ((xval-xmin)/(xmax-xmin))), r.height);
    }

    public void setXval(double x) { 
        this.xval = x;
        repaint();
    }
    public double getXval() { return xval; }
}

它作为独立的 JComponent 工作得很好。我调用 setXval(something) ,它更新得很好。 (编辑:我有一个定期更新数据的 Swing Timer)

但是,如果这个组件是我在 TableCellRenderer.getTableCellRendererComponent() 中返回的组件,那么它只会在我单击相关单元格时重新绘制。是什么赋予了?我一定遗漏了一些非常简单的东西。

最佳答案

出于性能原因,JTable 重用渲染器组件来绘制多个单元格 - 因此,当您在 JTable 中看到该组件时,它实际上并不存在于传统意义上的容器中存在于某个位置的组件中。这意味着在渲染器组件上调用 repaint() 不会执行任何操作。

最有效的选择是将条形的整数值存储在 TableModel 中。您的 TableCellRenderer 将如下所示:

public class BarTableCellRenderer implements TableCellRenderer {
    private final BarRenderer rendererComponent = new BarRenderer(0, 10);

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        rendererComponent.setXval((Integer)value);
        return rendererComponent;
    }
}

然后,您可以更改 TableModel 中的 Integer,它将触发栏的重新绘制(您可能需要 TableModel.fireTableCellUpdated ,具体取决于您正在使用的 TableModel 实现)。

关于java - 在 TableCellRenderer 中使用自定义 Swing JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/864707/

相关文章:

java - 为什么我的程序有时会卡住?

java - 从一开始就设置 JTextfield 焦点

java - JPanel 内的 JPanel

java - 如何将2个JComponent添加到JPanel的同一位置

java - 如何在 BadRequestException 中包含消息?

java - 使用Java剪切流中的音频数据

java - Selenium 找到元素但随机不单击某个元素,尽管在 Firefox 上是这样说的

java - 在半透明框架/面板/组件上重新绘制。

java - GroupLayout 未按预期运行

java - 从容器中查找并检索组件