2017-10-12 2 views
0

Ich erzeuge eine Heatmap, mit Jtable und füllen sie mit Zahlen, dann mit Farben enter image description here. Anstelle von Farben möchte ich die Kreise oder ein anderes graphisches Bild zeigen, das in der Größe relativ ist, wie dieses enter image description here. Ich habe eine Bibliothek in R gefunden, geom_tile, konnte aber keine Möglichkeit finden, es in Javs zu machen. Habt ihr eine Idee oder ein Beispiel dafür, wie es geht?Wie zeichne Heatmap in Java, Kreise statt Farbe

+0

https://stackoverflow.com/questions/4941372/how-to-insert-image-into-jtable-cell – assylias

Antwort

1

Um benutzerdefinierte Tabellenzellen zu zeichnen, müssen Sie eine eigene Implementierung von TableCellRenderer bereitstellen.

Ihr benutzerdefinierter TableCellRenderer muss nur eine Methode implementieren: getTableCellRendererComponent, die eine Component oder JComponent zurückgeben muss.

Ihr TableCellRenderer kann dann eine benutzerdefinierte JComponent zurückgeben, die den Kreis abhängig vom Zellwert zeichnet, der zuvor festgelegt wurde.

Im Folgenden ein demonstriert Beispielcode ist die benutzerdefinierte Einstellung HeatmapCellRenderer, die ein DotRenderer als Komponente verwendet eine einzelne Zelle zu machen:

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); 
     } 

    } 

} 

Der obige Code eine Tabelle ähnlich den folgenden Screenshot erzeugen soll:

example screenshot

Durch komplexere Objekte als nur eine Integer für Ihre Zellen verwenden, können Sie komplexere rende implementieren rer. Wenn Sie beispielsweise eine einfache Datenklasse class MyData { int value1; int value2; } haben und solche Werte in die Tabelle einfügen, können Sie einen Renderer implementieren, der die Hintergrundfarbe abhängig von und die Größe des Punkts basierend auf value2 des Zellenwerts festlegt. Wenn Sie der Klasse value3 hinzufügen, können Sie die Punkte basierend auf diesen Werten farblich abgrenzen und so Ihrem Beispielbild ziemlich nahe kommen.

Verwandte Themen