2017-10-12 6 views
0

히트 맵을 생성하고, Jtable을 사용하여 숫자로 채운 다음 enter image description here으로 히트 맵을 생성합니다. 색상 대신 동그라미 나 다른 그래픽 이미지 (크기가 상대적 일 수 있음) (예 : enter image description here)를 표시하고 싶습니다. R에서 하나의 라이브러리 geom_tile을 찾았지만 Jav에서 수행 할 수있는 방법을 찾을 수 없었습니다. 너희들은 어떻게하는지에 대한 어떤 생각이나 예를 가지고 있니?자바에서 히트 맵을 그리는 방법, 색상 대신 원을 표시하는 방법

+0

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

답변

1

사용자 정의 테이블 셀을 그리려면 TableCellRenderer을 직접 구현해야합니다.

사용자 정의 TableCellRenderer는 이라는 하나의 메서드 만 구현해야하며 Component 또는 JComponent을 반환해야합니다.

TableCellRenderer는 미리 설정된 셀 값에 따라 원을 그리는 사용자 정의 JComponent를 반환 할 수 있습니다. 에서

는 A 단일 셀 렌더링하는 구성 요소로 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); 
     } 

    } 

} 

가 : 더 복잡한 것보다는 다만 오브젝트 당신의 세포에 대한 Integer를 사용하여

example screenshot

, 당신은 더 복잡한 Rende의를 구현할 수 다시. 예를 들어, 간단한 데이터 클래스 class MyData { int value1; int value2; }을 가지고 있고 그 값을 테이블에 삽입하는 경우 value1에 따라 배경색을 설정하는 렌더러와 셀 값의 value2을 기반으로하는 도트의 크기를 구현할 수 있습니다. 클래스에 value3을 추가하면 이러한 값을 기반으로 도트를 색칠 할 수 있으므로 예제 이미지와 거의 유사합니다.