2010-05-14 40 views
4

所以我想寫一個矩陣瀏覽器,使我能夠重新排列矩陣的行和列。 對於這個porpouse,我使用了Jtable類。現在我遇到的問題是通過查看double值來重新排列矩陣非常困難,所以我想打印矩陣不是用double值,而是用圓圈半徑代表值的圓圈打印。這樣我就可以更快地分辨大值和小值之間的區別。如何在java中的二維矩陣中表示double值

任何人都有任何想法如何我可以將這個雙重值變成實心圓與JTable或任何表類的事情?

回答

11

下面是一個custom renderer的示例,該示例使用Icon接口來執行繪圖。這種方法可以更輕鬆地控制文本和圖標的相對位置。請注意,渲染器基於區間[0, 1)中歸一化值的假設進行縮放;您可能想要查詢您的數據模型的最小值和最大值。

icon renderer

class DecRenderer extends DefaultTableCellRenderer implements Icon { 

    private static final int SIZE = 32; 
    private static final int HALF = SIZE/2; 
    DecimalFormat df; 

    public DecRenderer(DecimalFormat df) { 
     this.df = df; 
     this.setIcon(this); 
     this.setHorizontalAlignment(JLabel.RIGHT); 
     this.setBackground(Color.lightGray); 
    } 

    @Override 
    protected void setValue(Object value) { 
     setText((value == null) ? "" : df.format(value)); 
    } 

    @Override 
    public void paintIcon(Component c, Graphics g, int x, int y) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setColor(Color.blue); 
     double v = Double.valueOf(this.getText()); 
     int d = (int)(v * SIZE); 
     int r = d/2; 
     g2d.fillOval(x + HALF - r, y + HALF - r, d, d); 
    } 

    @Override 
    public int getIconWidth() { 
     return SIZE; 
    } 

    @Override 
    public int getIconHeight() { 
     return SIZE; 
    } 
} 
+0

真正goooood,phaaa +1 – mKorbel 2011-07-13 20:36:42

+0

單元格渲染器,無論是ListCellRenderer或的TableCellRenderer,他們都去了我的頭,LOL :-),還是我幫我的頭,當談到對於這些主題,儘管隨着我越來越多地搜索和閱讀,看起來它們不會被拋在後面,當談到Swing時。在許多方面,人們可以用它們做的奇妙的事情。我很久以前就看過這個例子,但對Swing來說,繪畫對我來說是遙不可及的。現在將緩慢地運行所有示例,學習許多新事物:-) – 2012-08-19 15:54:43

+1

@GagandeepBali:這種渲染器和編輯器是[_flyweight pattern_](http://en.wikipedia.org/wiki/Flyweight_pattern)的示例,我發現有幫助的基本概念。 – trashgod 2012-08-19 16:05:59

3

你將不得不編寫你的自定義Cell Renderer

該組件將被用作橡皮圖章;爲每個單元調用paint方法。

在paint方法中繪製圓;

g.fillOval(x - radius/2, y - radius/2, radius, radius); 

將在(x,y)繪製radius與中心點的圓。