Wie doppelte Werte als Kreise in einer 2D-Matrix in Java repräsentieren
-
26-09-2019 - |
Frage
so möchte ich eine Matrix-Explorer schreiben, die mir einer Matrix Neuordnungs Zeilen und Spalten ermöglicht. Aus diesem porpouse verwendete ich die Klasse JTable. Nun ist das Problem, dass ich habe, ist, dass es sehr schwierig ist, eine Matrix, indem man doppelte Werte neu zu ordnen, so würde Ich mag die Matrix drucken nicht mit den doppelten Werten, aber mit Kreisen, in denen der Radius des Kreises, den Wert darstellt. So dass ich den Unterschied zwischen großen Werten sagen kann und kleine Werte schneller.
Wer hat eine Idee, wie ich diese doppelten Werte in gefüllten Kreise mit JTable drehen kann, oder jede Tabellenklasse für diese Angelegenheit?
Lösung
Hier ist ein Beispiel für einen benutzerdefinierten Renderer , dass Geräte die Icon
Schnittstelle, um die Zeichnung zu tun. Dieser Ansatz ermöglicht eine einfachere Kontrolle über die relative Positionierung des Textes und Symbol. Beachten Sie, dass die Renderer Skalen basierend auf der Annahme von normalisierten Werten im Intervall [0, 1)
; Sie können stattdessen Ihr Datenmodell für die Minimal- und Maximalwerte abzufragen.
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;
}
}
Andere Tipps
In Kürze erhalten Sie haben Ihre individuelle schreiben Cellrenderer .
Die Komponente wird als ein Stempel verwendet werden; die paint
Methode wird für jede Zelle genannt.
Zeichnen Sie den Kreis in der paint-Methode;
g.fillOval(x - radius / 2, y - radius / 2, radius, radius);
Wird ein Kreis von radius
mit Mittelpunkt bei (x,y)
ziehen.