gpt4 book ai didi

java - 如何在java中绘制热图,显示圆圈而不是颜色

转载 作者:行者123 更新时间:2023-12-02 02:33:43 31 4
gpt4 key购买 nike

我正在生成一个热图,使用 Jtable 并用数字填充它,然后用颜色填充 enter image description here 。我想显示圆圈或其他一些图形图像,而不是颜色,它们的大小是相对的,就像这样 enter image description here 。我在 R 中找到了一个库可以做到这一点,geom_tile,但找不到任何在 Javs 中做到这一点的方法。你们有关于如何做到这一点的任何想法或示例吗?

最佳答案

要绘制自定义表格单元格,您需要提供自己的 TableCellRenderer 实现.

您的自定义 TableCellRenderer 必须仅实现一种方法:getTableCellRendererComponent,该方法必须返回 ComponentJComponent .

然后,您的 TableCellRenderer 可以返回一个自定义 JComponent,该 JComponent 根据预先设置的单元格值绘制圆圈。

下面有一个示例代码,演示如何设置自定义 HeatmapCellRenderer,它使用 DotRenderer 作为组件来渲染单个单元格:

public class TableHeatmap {

public static void main(String[] args) {
JFrame frame = new JFrame();
// create a demo table 10 x 10 cells
JTable table = new JTable(10, 10);
frame.setContentPane(table);

// fill in some random data
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
table.setValueAt((int) (Math.random() * 10), row, col);
}
}

// set our custom TableCellRenderer
table.setDefaultRenderer(Object.class, new HeatmapCellRenderer());
table.setRowHeight(30);

// show the window
frame.pack();
frame.setVisible(true);
}

private static class HeatmapCellRenderer implements TableCellRenderer {

private final DotRenderer renderer = new DotRenderer();

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Integer) {
this.renderer.setValue((Integer) value);
return this.renderer;
}
return null;
}
}

private static class DotRenderer extends JComponent {
private int value;

public void setValue(int value) {
this.value = value;
}

@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.RED);
int centerX = this.getWidth() / 2;
int centerY = this.getHeight() / 2;
g.fillOval(centerX - this.value, centerY - this.value, this.value * 2, this.value * 2);
}

}

}

上面的代码应该生成一个类似于以下屏幕截图的表格:

example screenshot

通过为单元格使用比Integer更复杂的对象,您可以实现更复杂的渲染器。例如,如果您有一个简单的数据类 class MyData { int value1;整数值2; } 并将这些值插入到表中,您可以实现一个渲染器,根据 value1 设置背景颜色,并根据 value2 设置点的大小的单元格值。向类中添加 value3 将进一步允许根据这些值对点进行着色,非常接近您的示例图像。

关于java - 如何在java中绘制热图,显示圆圈而不是颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716408/

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