Как представить двойные значения как круги в 2d матрице в Java
Поэтому я хочу написать матричный проводник, который позволит мне изменить порядок строк и столбцов матрицы. Для этой части я использовал класс Jtable. Теперь у меня проблема в том, что очень трудно переупорядочить матрицу, рассматривая двойные значения, поэтому я хотел бы напечатать матрицу не с двойными значениями, а с кружками, в которых радиус окружности представляет значение. Чтобы я мог быстрее отличить большие значения от маленьких.
У кого-нибудь есть идеи, как я могу превратить эти двойные значения в заполненные круги с помощью JTable или любого другого табличного класса?
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;
}
}
Вам нужно будет написать свой собственный Cell Renderer.
Компонент будет использоваться как резиновый штамп; paint
метод вызывается для каждой ячейки.
Нарисуйте круг в методе рисования;
g.fillOval(x - radius / 2, y - radius / 2, radius, radius);
Нарисует круг radius
с центральной точкой в (x,y)
,