gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:40:45 25 4
gpt4 key购买 nike

好的,我知道如何制作一个简单的自定义 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com