2010-05-14 1 views
4

, поэтому я хочу написать матричный проводник, который позволяет мне изменять порядок строк и столбцов матрицы. Для этой porpouse я использовал класс Jtable. Теперь проблема в том, что очень сложно переупорядочить матрицу, посмотрев на двойные значения, поэтому я хотел бы напечатать матрицу не с двойными значениями, а с кругами, в которых радиус круга представляет значение. Так что я могу быстрее определить разницу между большими значениями и небольшими значениями.Как представить двойные значения в виде кругов в 2d-матрице в java

Кто-нибудь знает, как я могу превратить эти двойные значения в заполненные круги с помощью 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

, что на самом деле Гуууууд, phaaa +1 – mKorbel

+0

Клеточные Renderers, будь то ListCellRenderer или TableCellRenderer, все они идут по моей голове, LOL :-), до сих пор я чешу голову, когда речь идет о к этим темам, хотя, поскольку я ищу и читаю все больше и больше, кажется, что они не являются чем-то, что нужно оставить, когда дело доходит до Свинг. Замечательные вещи, которые можно сделать с ними, во многих аспектах. Я видел этот пример долгое время назад, но тогда картина была далекой для меня в Свинге. Теперь вы будете проходить через все ваши примеры медленно, изучая много нового :-) –

+1

@GagandeepBali: такие рендереры и редакторы являются примерами [_flyweight pattern_] (http://en.wikipedia.org/wiki/Flyweight_pattern), базовая концепция, которую я нашел полезной. – trashgod

3

Вам нужно будет написать свой заказ Cell Renderer.

Компонент будет использоваться в качестве штампа; для каждой ячейки вызывается метод paint.

Нарисуйте круг в методе краски;

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

нарисует круг radius с центральной точкой на (x,y).