Как представить двойные значения в виде кругов в 2d-матрице в java

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

Кто-нибудь знает, как я могу превратить эти двойные значения в заполненные круги с помощью JTable или любого класса таблицы в этом отношении?


person woolagaroo    schedule 14.05.2010    source источник


Ответы (2)


Вот пример настраиваемого модуля визуализации, реализует интерфейс Icon для рисования. Такой подход упрощает управление относительным расположением текста и значка. Обратите внимание, что средство визуализации масштабируется на основе предположения о нормализованных значениях в интервале [0, 1); вместо этого вы можете запросить у своей модели данных минимальное и максимальное значения.

средство визуализации значков

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;
    }
}
person trashgod    schedule 14.05.2010
comment
это действительно хорошо, фааа +1 - person mKorbel; 14.07.2011
comment
Рендереры ячеек, будь то ListCellRenderer или TableCellRenderer, они все выходят за рамки моей головы, LOL :-), все же я чешу голову, когда дело доходит до этих тем, хотя, когда я ищу и читаю все больше и больше, кажется, что это не так. что-то, что нужно оставить позади, когда дело доходит до Swing. Замечательные вещи можно делать с ними во многих аспектах. Я видел этот пример давным-давно, но тогда рисование в Swing было для меня далеким делом. Теперь потихоньку пробежусь по всем вашим примерам, узнавая много нового :-) - person nIcE cOw; 19.08.2012
comment
@GagandeepBali: такие средства визуализации и редакторы являются примерами приспособленческого шаблона , основная концепция, которую я нашел полезной. - person trashgod; 19.08.2012
comment
Это одна интересная штука. Узоры тоже интересны, кажется, сейчас в моем ToDoList другое дело :-) - person nIcE cOw; 19.08.2012
comment
+1 только потому, что этот пост заставил меня узнать о подсказках рендеринга. :-) Довольно мило. - person The111; 18.01.2013
comment
См. также этот связанный пример с изменением яркости. - person trashgod; 13.02.2014

Вам нужно будет написать собственный обработчик ячеек.

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

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

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

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

person Pindatjuh    schedule 14.05.2010