Comment représenter des valeurs doubles comme des cercles dans une matrice 2D en Java
-
26-09-2019 - |
Question
donc je veux écrire un explorateur de matrice qui me permet de lignes et de colonnes Réorganiser d'une matrice. Pour cette porpouse je la classe JTable. Maintenant, le problème que j'est qu'il est très difficile de modifier l'ordre d'une matrice en regardant les valeurs doubles, donc je voudrais imprimer la matrice pas avec les doubles valeurs, mais avec des cercles dans lesquels le rayon du cercle représente la valeur. Alors que je peux dire la différence entre les grandes valeurs et petites valeurs plus rapidement.
Tout le monde a une idée comment je peux tourner cette double des valeurs dans les cercles remplis de JTable ou d'une classe de table pour cette question?
La solution
Voici un exemple d'un personnalisé renderer qui implémente l'interface Icon
pour faire le dessin. Cette approche permet un contrôle plus facile sur le positionnement relatif du texte et de l'icône. Notez que les échelles de renderer basées sur l'hypothèse des valeurs normalisées dans l'intervalle [0, 1)
; vous pouvez interroger votre modèle de données pour les valeurs minimales et maximales au lieu.
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;
}
}
Autres conseils
Vous devez écrire votre commande CellRenderer .
Le composant sera utilisé comme un tampon en caoutchouc; la méthode de paint
est appelé pour chaque cellule.
Tracer le cercle dans le procédé de peinture;
g.fillOval(x - radius / 2, y - radius / 2, radius, radius);
tirerai un cercle de radius
avec point central à (x,y)
.