2017-10-12 3 views
0

ヒートマップを生成し、Jtableを使用して番号をつけ、次に色で塗りつぶします。 enter image description here。色の代わりに、この円のような大きさの相対的なグラフィック画像を表示するには、enter image description hereのようにします。 Rで1つのライブラリgeom_tileが見つかりましたが、Javsでそれを行う方法が見つかりませんでした。皆さんはどんなアイデアを持っていますか、それを行う方法の例はありますか?Javaでヒートマップを描画する方法、色の代わりに円を表示する方法

+0

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

答えて

1

カスタムテーブルセルを描画するには、TableCellRendererの独自の実装を提供する必要があります。

カスタムTableCellRendererは、ComponentまたはJComponentを返す必要がある1つのメソッド(getTableCellRendererComponent)のみを実装する必要があります。

TableCellRendererは、あらかじめ設定されているセルの値に応じて円を塗りつぶすカスタムJComponentを返すことができます。

以下では1つのセルをレンダリングするコンポーネントとしてDotRendererを使用してカスタムHeatmapCellRendererを設定示すサンプルコードがある:

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; int value2; }があり、そのような値をテーブルに挿入する場合は、value1に依存する背景色と、セル値のvalue2に基づいてドットのサイズを設定するレンダラーを実装できます。クラスにvalue3を追加することで、これらの値に基づいてドットを着色することが可能になり、サンプル画像にかなり近づきます。

関連する問題