Как представить двойные значения как круги в 2d матрице в Java - PullRequest
4 голосов
/ 14 мая 2010

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

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

Ответы [ 2 ]

11 голосов
/ 14 мая 2010

Вот пример пользовательского рендерера , который реализует интерфейс 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;
    }
}
3 голосов
/ 14 мая 2010

Вам придется написать свой пользовательский Cell Renderer .

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

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

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

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

...